这是hashCode()的一个很好的实现吗?

时间:2015-06-11 19:17:28

标签: java equals implementation hashcode

我有一个class将在HashSet中使用。它只包含两个成员,两者都是相同类型的接口。这就是它的样子:

class MyClass{
    MyInterface a;
    MyInterface b;

    public int hashCode(){
         return a.hashCode() + b.hashCode();
    }

    public boolean equals(Object obj){
         if(!(obj instanceof MyClass)
              return false;
         MyClass other (MyClass) obj;
         return (this.a == other.a && this.b == other.b) || (this.a == other.b && this.b == other.a);
    }
}

如您所见,MyClass的两个实例如果包含MyInterface的相同两个实例,则“相等”。

现在,我在考虑hashCode(),我可以添加其成员的默认哈希码。这够好吗?如果没有,对于这种情况,hashCode()的正确实施是什么?

3 个答案:

答案 0 :(得分:4)

是的,这完全没问题。它等同于Set.hashCode()对双元素集的实现。

答案 1 :(得分:1)

我会说不。这不意味着MyClass的这两个实例会散列到相同的值:

MyClass {
  a.hashCode = 2;
  b.hashCode = 3;
}

MyClass {
  a.hashCode = 1;
  b.hashCode = 4;
}

答案 2 :(得分:0)

是的。

因为即使使用hashCode冲突,the docs state

  

如果两个对象根据不相等而不是必需的   equals(java.lang.Object)方法,然后调用hashCode方法   两个对象中的每一个都必须产生不同的整数结果。