【发布时间】:2014-08-13 14:46:17
【问题描述】:
我想为以下等号方法生成一个哈希码。
public MyClass class {
private int a;
private final String b;
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MyClass)) return false;
MyClass myClass = (MyClass) o;
return a == myClass.a || (b == null ? myClass.b == null : b.equals(myClass.b));
}
@Override
public int hashCode() {
int result = (int) (a^ (a >>> 32));
result = 31 * result + (b != null ? b.hashCode() : 0);
return result;
}
}
问题在于,equals 在两种情况中的一种或两种情况下都返回 true:o1.a == o2.a 或 o1.b == o2.b。在这种情况下,通常的哈希值不会相同:myClass("a", "b") 和 myClass("a", null)
【问题讨论】:
-
解决方案:要么对哈希数据结构使用复合键,要么对每个字段分别使用不同的哈希数据结构。
标签: java data-structures hash hashcode