关于equals
2016-11-11 本文已影响27人
JUNE言JUNE语
关于JAVA的面试,底层实现这部分是一个巨大的坑。
一个小问题
最后两个输出分别是什么
Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1 == o2);
System.out.println(o1.equals(o2));
答案是 false,false
第一个是false肯定没什么疑问,因为两个引用o1,o2分别指向两个不同的对象,这两个对象的地址肯定是不同的,而 "==" 就是比较两个对象的地址是否相同。
第二个false就需要查看Object的equals方法的源码了
public boolean equals(Object obj) {
return (this == obj);
}
从源码可以很明显看出,Object的equals方法跟 "==" 是没有任何区别的。
那么对于比较常用的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从两方面来判断两个String对象是否相等
1.引用地址是否相同
2.若引用地址不同,那么判断字符串长度,长度相同再判断字符串中每一个字符是否都相同(通俗一点说就是对应字符串的内容是否一样)。