按照下面的链接
因此假设如果2个对象相等(即equals()返回true),那么它们的hashCodes()必须返回相同的值。
但是考虑下面的例子
public class Test {
public static void main(String args[]) {
Demo d1 = new Demo(123);
Demo d2 = new Demo(123);
System.out.println("d1.hashCode()-->" + d1.hashCode());
System.out.println("d2.hashCode()-->" + d2.hashCode());
System.out.println(d1.equals(d2));
}
}
class Demo {
private int name;
Demo(int name) {
this.name = name;
}
@Override
public int hashCode() {
Double d = Math.random() * 1000;
return d.intValue();
}
@Override
public boolean equals(Object o) {
if ((o instanceof Demo) && (((Demo) o).getName() == this.getName())) {
return true;
} else {
return false;
}
}
public int getName() {
return name;
}
}
上面程序的输出是
d1.hashCode()-->85
d2.hashCode()-->692
true
这里的问题是即使哈希码不同 equals 方法返回 true。 那么这是否意味着对于对象的相等性我们不需要相同的哈希码
最佳答案
一些实现(例如 HashMap
)依赖于这样一个事实,即当两个实例相等时,它们的哈希码应该相同。但是,纯粹使用 equals 不会检查这些实例的哈希码。
在 HashMap 的情况下,首先根据对象的哈希码将元素划分到不同的哈希桶中(出于性能原因)。在桶内,equals 用于检查对象是否相等。如果两个相同的实例没有相同的 hashCode
,它们将最终进入不同的桶,并且这可能会由于违反契约而导致意外行为。
关于java - 相等性测试(equals 和 hashcode 方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5482066/