[英]Equal Objects must have equal hashcodes?
相等的对象必须具有相等的哈希码。 根据我的理解,当我们打算在基于哈希的数据结构中使用对象时,此语句是有效的。 这是Java文档中哈希码和equals方法的合同之一。 我探讨了为什么要这样说,并查看了hashtable的实现,并在put
方法中找到了以下代码
if ((e.hash == hash) && e.key.equals(key))
所以我明白了,合同来自上面的条件e.hash == hash
。 我进一步尝试探索为什么在比较两个对象是否相等时java是否检查哈希码。 所以这是我的底线
如果两个相等的对象具有相等的hascode,则可以将它们存储在同一存储桶中,这对于仅在单个存储桶中查找而言将是一个好习惯
最好检查哈希码,然后再实际调用equals方法,因为hascode方法的成本比equals方法便宜,因为在这里,我们只需要比较int值(其中equals方法可能涉及对象字段比较)。 因此,哈希码方法提供了一个额外的过滤器。
如果以上两个原因均正确,请纠正我?
equals()
你理解错了。 equals
仅返回一个布尔值(两个可能的值),并且需要另一个对象进行比较。 hashCode
返回一个int(2 ^ 32个可能的值),并且只需要调用该对象。
HashMap
尝试将其持有的所有对象分布在各个存储桶中。 在地图上调用put
,它必须确定将用于给定对象的存储桶。 因此,它使用hashCode
(对存储桶数取模)来决定使用哪个存储桶。 然后,一旦找到存储桶,它就必须检查密钥是否已在地图中。 为此,它将存储桶中的每个对象与要放入地图中的对象进行比较。 为此,它使用equals
。 如果找不到该对象,则将其添加到存储桶中。
不使用hashCode
因为它比equals
更快。 之所以使用它,是因为它允许在一组存储桶之间分配密钥。 而且,一次计算hashCode并将对象与(希望)0(在同一存储桶中的一个或两个对象)进行比较的速度要快得多,以将对象与已存储在地图中的数千个对象进行比较。
“我进一步尝试向Exlpore解释为什么在比较两个对象是否相等时java是否要检查Hashcode”。 Put方法不仅检查相等性,还尝试首先缩小范围,然后使用均等值。 这就是为什么我们需要将HashCode与Equals结合使用的原因,以防出现分类收集。
但是,如果您唯一的目的只是检查两个对象之间的相等性,则永远不需要哈希码方法。
默认情况下,Obj1.equals(Obj2)永远不会使用哈希码方法。
它是一种普通的合同类型,因此当我们将对象存储在基于哈希的数据结构中时,我们应该始终一致地将相同的对象放入哈希表或从哈希表中获取相同的对象。 它是我们创建的合同,必须遵循,以便顺利进行输入/输出过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.