[英]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会因此而不合适。
更一般而言, hashCode
和equals
应该基本上以相同的方式考虑相同的字段。 当然,这是一个非常奇怪的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()
合法的原因
hashCode()方法用于获取给定对象的唯一整数。 当此对象需要存储在某些HashTable之类的HashMap数据结构中时,该整数用于确定存储桶的位置。 但是默认情况下,Object的hashCode()方法返回一个整数来表示存储对象的内存地址。
顾名思义,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.