条件等于的HashCode

时间:2014-06-23 14:03:40

标签: java data-structures hash hashcode

我想为以下equals-method生成哈希码。

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)

1 个答案:

答案 0 :(得分:9)

忘记哈希 - 你的平等比较从根本上打破了。

考虑三个值:

foo: a=10, b=0
bar: a=10, b=5
baz: a=20, b=5

现在:

foo.equals(bar) => true because of a
bar.equals(baz) => true because of b
foo.equals(baz) => false because neither a nor b match

这违反了Object.equals的传递性要求:

  

对于任何非空引用值xyz,如果x.equals(y)返回true并且y.equals(z)返回{{ 1}},然后true应该返回x.equals(z)

如果你没有传递性,那么除了返回一个常量(有效但不完全有用)之外,很难找到有效的true实现。

相关问题