这是 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.
我有一个 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()
的正确实施是什么?
是的,这非常好。它相当于对二元集合 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.