我遇到了一个关于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会因此而不合适。

更一般地,hashCodeequals应该基本上以相同的方式考虑相同的字段。当然,这是一个非常奇怪的equals实现-您通常应该检查每个涉及的字段之间的相等性。在某些情况下,字段可能以允许乘法等的方式相互关联,但我不希望这涉及字符串长度...

一个经常使人困惑的重要观点是,对于不相等的对象使用相同的哈希码是有效的。突出显示的情况(具有不同哈希码的相等对象)是不可接受的。

10-04 14:55