我遇到了一个关于equals和hashCode合同的问题:
这里是
鉴于:
class SortOf {
String name;
int bal;
String code;
short rate;
public int hashCode() {
return (code.length() * bal);
}
public boolean equals(Object o) {
// insert code here
}
}
以下哪一项将满足此的equals()和hashCode()合同
类? (选择所有适用项。)
正确答案
C:
return ((SortOf)o).code.length() * ((SortOf)o).bal == this.code.length() *
this.bal;
D:
return ((SortOf)o).code.length() * ((SortOf)o).bal * ((SortOf)o).rate ==
this.code.length() * this.bal * this.rate;
我有一个关于最后选择D的问题,请问是否两个对象
A:code.length = 10,bal = 10,rate = 100
B:code.length = 10,bal = 100,rate = 10
然后使用D中的
equals()
方法,我们得到A.equals(B)
评估为true
对吗?但是然后他们得到了不同的hashCode,因为它们具有不同的余额?是我在某个地方误解了这个概念吗?有人可以帮我澄清一下吗? 最佳答案
没错-D会因此而不合适。
更一般地,hashCode
和equals
应该基本上以相同的方式考虑相同的字段。当然,这是一个非常奇怪的equals
实现-您通常应该检查每个涉及的字段之间的相等性。在某些情况下,字段可能以允许乘法等的方式相互关联,但我不希望这涉及字符串长度...
一个经常使人困惑的重要观点是,对于不相等的对象使用相同的哈希码是有效的。突出显示的情况(具有不同哈希码的相等对象)是不可接受的。