Object的“==”和equals
“==”比较的是引用的地址值;
equals调用的也是“==”这个方法,源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
所以,如果我们对三个对象o1、o2、o3做比较,结果如下:
Object o1 = new Object();
Object o2 = new Object();
Object o3 = o2;
System.out.println(o1.equals(o2)); // false
System.out.println(o1==o2); // false
System.out.println(o3.equals(o2)); // true
System.out.println(o3==o2); // true
String的“==”和equals
String继承与Object,所以他的==和上面的结果一致,对比的也是对象的引用地址;
String重写了equals方法,比较的是String所代表的字符值;
源码:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
所以对s1,s2,s3的比较有如下结果:
String s1 = new String("aaaaaaa");
String s2 = new String("aaaaaaa");
String s3 = s2;
System.out.println(s1==s2); // false
System.out.println(s1.equals(s2)); // true
System.out.println(s3==s2); // true
System.out.println(s3.equals(s2)); // true
结论
1、基本类型“==”比较的为值比较,对象“==”比较的是对象引用地址的比较;
2、Object.equals比较的为对象引用地址比较,String.equals比较的为引用的字符值;
3、基本类型对应的对象引用,和String一致,即equals比较的也是值比较。
补充知识:
1、hashCode()和(“==”、equals)没关系,作用是:在为对象进行散列的时候,作为key值输入,所以我们的对象的hashCode()尽量不要相同。
2、Object默认提供的实现是:在内存地址的基础上通过特定算法得出的,保证了hash值的不同。
当我们看到hashCode的时候,难道不应该想到hashMap、hashSet等和hash有关的类吗?还是就是重写equals()和hashCode()d的话题。这些另起一片文章来说吧。