至于人物的定义:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
导致2个Person对象a,b如果a.equals(b)返回必须具有相同的哈希码true,我该如何实现该hashCode方法?
解
我的equals方法实现,根据Java的等效协议是不正确的:传递不满意: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;
}
Run Code Online (Sandbox Code Playgroud)
这将使基于散列的查找执行得非常糟糕.
任何一种或者一种测试equals()通常都是一个坏主意; 对象实际上并不相同,是吗?也许他们只是"相互匹配?" 也许您应该考虑equals()单独留下并实施其他比较方法.
托马斯指出,你的equals()测试不是传递性的; 如果a.equals(b) && b.equals(c)是真的那么a.equals(c)必须是真的.这是不是真的与你的过载,因此您的实现打破了合同equals().我强烈建议您以不同的方法实施此测试并equals()单独留下.
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |