繁体   English   中英

等于和hashCode

[英]equals and hashCode

我遇到了一个关于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实现-您通常应该检查每个涉及的字段之间的相等性。 在某些情况下,字段可能以允许乘法等的方式相互关联,但我不希望这涉及字符串长度...

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

一切都与履行合同有关 (就此问题而言)。 不同的实现(具有hasCode和equal的实现)具有不同的局限性和自身的优势-因此,供开发人员检查。

但是他们又得到了不同的hashCode,因为它们的余额不同?
究竟! 但是,这就是为什么您应该选择选项C的原因。这个问题是要检验您对履行合同概念的了解,而不是哪种hascode会更适合这种情况。

更多说明:
您始终需要检查的是: 您的hashCode()实现应使用与equals()方法相同的实例变量。

这些实例变量在这里是:hashCode()中使用的code.length()bal ,因此您也被限制在equals()使用这些相同的变量。 (除非您可以编辑hashCode()实现并为其添加rate

您必须至少检查.hashCode()使用的所有字段,以便相等的对象具有相同的哈希值。 但是您可以相等地检查更多字段,让不同的对象具有相同的哈希值完全可以。 看来您在做SCJP 1.6吗? 凯瑟琳·塞拉(Katherine Sierra)和贝特·贝茨(Bert Bates)撰写的SCJP 1.6手册对此主题进行了很好的介绍。

注意:这就是为什么在从.hashCode()返回常量值的同时实现有用的.equals()合法的原因

  1. hashCode()方法用于获取给定对象的唯一整数。 当此对象需要存储在某些HashTable之类的HashMap数据结构中时,该整数用于确定存储桶的位置。 但是默认情况下,Object的hashCode()方法返回一个整数来表示存储对象的内存地址。

  2. 顾名思义,equals()方法用于简单地验证两个对象的相等性。 默认实现只是检查两个对象的对象引用以验证其相等性。

相等的对象必须具有相等的哈希码。

equals()必须定义一个相等关系。 如果未修改对象,则必须继续返回相同的值。 o.equals(null)必须始终返回false。

hashCode()也必须是一致的,如果未按照equals()修改对象,则它必须保持返回相同的值。

两种方法之间的关系为:

只要a.equals(b),则a.hashCode()必须与b.hashCode()相同。

请参阅: https : //howtodoinjava.com/interview-questions/core-java-interview-questions-series-part-1/

通常,如果您在类中覆盖另一个,则应始终覆盖一个。 如果不这样做,则在哈希映射/哈希表等中使用该类时,您可能会遇到麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM