答案
否,即Java中hashCode() 相同,equals() 也不一定为 true。因为hashCode()返回的是对象的hash值,它是一个算法,有可能不同的对象的hashCode值相等。
要证明这一点,下面给出String中,hashCode相同,equals返回false的例子。
String s1 = "Aa";
String s2 = "BB";
System.out.println(String.format("s1:%s , s2:%s", s1.hashCode(),s2.
hashCode()));
System.out.println(s1.equals(s2));
结果为:
s1:2112 , s2:2112
false
false
从结果中我们看到hashCode()的结果相同,但是equals为false。
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;
}
总结
- 如果两个对象hashcode相等,则equals可能返回true或false。
- 如果两个对象hashcode不相等,则equals一定返回false。
- 如果两个对象equals为false,他们的hashcode有可能相等。
- 如果两个对象equals为true,Java运行时环境会认为他们的hashcode一定相等。