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

Is this a good implementation of 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.

的两个相同实例,则它们是 "equal"

现在,我在想对于 hashCode(),我可以将其成员的默认哈希码相加。这够好了吗?如果不是,对于这种情况 hashCode() 的正确实施是什么?

是的,这非常好。它相当于对二元集合 Set.hashCode() 的实现。

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

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

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

是的。

因为即使有 hashCode 冲突,the docs state:

It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results.