关于Person的定义:
public class Person {
private int id;
private int characteristics;
public boolean equals (Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof Person) {
if (id == ((Person) obj).id) {
return true;
} else if (characteristics == ((Person) obj).characteristics) {
return true;
}
}
return false;
}
}
原因 2 Person
对象 a
和 b
必须具有相同的哈希码如果 a.equals(b)
返回true
,我该如何实现hashCode
方法呢?
解决方案
根据 Java 的等价协议(protocol),我的 equals
方法实现不正确:传递性 不满足:a.id = 1
, a.characteristic = 2
, b.id = 1
, b.characteristic = 3
, c.id = 2
, c.characteristic = 3
; a.equals(b) == true
,b.equals(c) == true
,但是 a.equals(c) == false
.
最佳答案
由于当对象各自的 id
或 characteristics
字段相等时,您的类认为对象相等,因此您可以在此处合理使用的唯一哈希码是所有对象的常量值实例:
public int hashCode() {
return 0;
}
这将使基于散列的查找执行得非常糟糕。
equals()
中的非此即彼测试通常不是一个好主意;这些对象实际上并不相等,对吗?或许他们只是“相亲相爱”?或许您应该考虑单独使用 equals()
并实现一些其他比较方法。
正如 Thomasz 所指出的,您的 equals()
测试不是可传递的;如果 a.equals(b) && b.equals(c)
为真,则 a.equals(c)
必须为真。这对于您的重载不是正确的,因此您的实现违反了equals()
的约定。我强烈建议您以不同的方法实现此测试,不要管 equals()
。
关于java - 如何重写这个 hashCode 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987112/