equals:原来一直觉得equals和==的区别equals比较的是内容,==比较的是地址和内容,看了Object和String的源码才知道,不能这样的浅显的去记忆。
Object的equals
public boolean equals(Object obj) {
return (this == obj);
}
说明Object比较的是对象的地址,如果地址一样就返回true,其实是因为Object中没有属性
String的equals
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;
}
String的equals是对Object的重写,所以他的参数要和Object的一样,
其中value是String的一个属性,char数组,保存String的内容,说明String中比较的是内容,并没有比较地址
hashCode:
Object的hashCode:本地方法Native
public native int hashCode();
String的hashCode:
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;
}
可以看出String的hashCode计算的时候按照内容计算的,所以两个不同的String对象,内容相同hashCode值相同
Object object = new Object();
Object object2 = new Object();
System.out.println(object.equals(object2)); System.out.println(object==object2);
System.out.println(object.equals(object2));
System.out.println(object==object2);
String string = new String("abc");
String string2 = new String("abc");
System.out.println(string.equals(string2));
System.out.println(string==string2);
System.out.println(object.hashCode());
System.out.println(object2.hashCode()); System.out.println(string.hashCode());
System.out.println(string2.hashCode());
结果:
false
false
false
false
true
false
705927765
366712642
96354
96354
有关为什么用hashCode,以及重写equals要重写hashCode,可以参考
java中hashcode()和equals()的详解