答案

否,即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

 从结果中我们看到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;
}

总结

  1. 如果两个对象hashcode相等,则equals可能返回true或false。
  2. 如果两个对象hashcode不相等,则equals一定返回false。
  3. 如果两个对象equals为false,他们的hashcode有可能相等。
  4. 如果两个对象equals为true,Java运行时环境会认为他们的hashcode一定相等。