数组的equals和==比较
import java.util.Arrays;
class ComparingArrays
{
public static void main(String[] args)
{
int[] a1 = new int[10];
int[] a2 = new int[10];
Arrays.fill(a1,47);
Arrays.fill(a2,47);
System.out.println(Arrays.equals(a1,a2));
System.out.println(a1==a2);
System.out.println(a1.equals(a2));
String[] str1 = new String[2];
Arrays.fill(str1,"HI");
String[] str2 = {new String("HI"),new String("HI")};
System.out.println(Arrays.equals(str1,str2));
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
}
}
/*Output
True
Flase
False
True
False
False
*/
元素的equals和==区别联系
概述:
A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同。
B.基本类型没有equals方法,equals只比较值(对象中的内容)是否相同(相同返回true)。
C.一个类如果没有定义equals方法,它将默认继承Object中的equals方法,返回值与==方法相同。
D.对于String a = “a”; Integer b = 1;这种类型的特有对象创建方式,==的时候值是相同的。
C观点:
import java.util.Arrays;
class A
{
}
public class ComparingArrays
{
public static void main(String[] args)
{
A a = new A();
A a1 = new A();
System.out.println(a.equals(a1));
System.out.println(a==a1);
a1 = a ;
System.out.println(a.equals(a1));
System.out.println(a==a1);
}
}
/*Output
False
False
True
True
*/
==和equals的实质
在JAVA中利用"=="比较变量时,系统使用变量在"栈"中所存的值作为比较的依据。即对于基本类型==比较的是值是否相等,对于对象比较的是所指向的引用是否相等.
基本数据类型在"栈"中存的是其内容值,而对象类型在"栈"中存的是地址,这些地址指向"堆"中的对象。
java.lang包中的Object类有public boolean equals(Object obj)方法,它比较两个对象是否相等。
其它对象的equals方法仅当被比较的两个引用指向的对象内容相同时,对象的equals()方法返回true。
总之,"=="和"!="比较的是地址.也可认为"=="和"!="比较的是对象句柄;而equals()比较的是对象内容.或者说,,"=="和"!="比较的是"栈"中的内容,而equals()比较的是"堆"中的内容.
D.对于String a = “a”; Integer b = 1;这种类型的特有对象创建方式,==的时候值是相同的。
对于String和Integer来说,由于他们特有的创建对象的方式。使用构造器和不使用构造器得到一个对象,==方法比较所产生的结果是不同的。 String a = “abc”; String b = "abc"; 此时a==b得到结果为true。String a = new String("abc"); String b = new String("abc");此时a==b得到的结果为false。Integer a = 1; Integer b = 1;此时a==b的结果是true。Integer a = new Integer(1); Integer b = new Integer(1);此时a==b得到的结果为false。
通过这一点其实我们也能够更加容易理解==对内存的实际操作,实际执行的是近似于基本类型比较。
深入探讨equals:
===================
equals方法的重要性毋须多言,只要你想比较两个对象是不是同一对象,你就应该实现equals方法,让对象用你认为相等的条件来进行比较.
下面的内容只是API的规范,没有什么太高深的意义,但我之所以最先把它列在这儿,是因为这些规范在事实中并不是真正能保证得到实现.
1.对于任何引用类型, o.equals(o) == true成立.
2.如果 o.equals(o1) == true 成立,那么o1.equals(o)==true也一定要成立.
3.如果 o.equals(o1) == true 成立且 o.equals(o2) == true 成立,那么
o1.equals(o2) == true 也成立.
4.如果第一次调用o.equals(o1) == true成立,在o和o1没有改变的情况下以后的任何次调用都成立.
5.o.equals(null) == true 任何时间都不成立.
原文:http://www.cnblogs.com/Rainner/p/3514905.html