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

时间:2011-08-07 08:09:28

标签: java collections hashcode

Equal Objects必须具有相同的哈希码。根据我的理解,当我们打算在基于哈希的数据集中使用对象时,此语句是有效的。这是java docs中hashcode和equals方法的合同之一。我在implementation of hashtable中探讨了为什么这样说并查看的原因,并在put方法中找到了以下代码

if ((e.hash == hash) && e.key.equals(key)) 

所以我明白了,合同来自上面条件e.hash == hash。我进一步试图探讨为什么java在比较两个对象是否相等时检查哈希码。所以这是我的理解

  • 如果两个相等的对象具有相同的hascodes,那么它们可以存储在同一个存储桶中,这样就可以在单个存储桶中查找

  • 检查哈希码然后实际调用equals方法更好,因为hascode方法比equals方法成本更低,因为这里我们只需比较int值,其中equals方法可能是对象字段比较。所以hashcode方法提供了一个额外的过滤器。

如果以上两个原因都有效,请纠正我?

4 个答案:

答案 0 :(得分:7)

  1. 如果两个不等的对象具有相同的哈希码,则更正,只是一个小的修正。
  2. 不完全是,最好先检查它,作为不相等的过滤器,但如果你想确保对象相等,你应该调用equals()

答案 1 :(得分:4)

你弄错了。 equals只返回一个布尔值(两个可能的值),需要另一个对象进行比较。 hashCode返回一个int(2 ^ 32个可能的值),只需要调用该对象。

HashMap尝试在桶中分发它所拥有的所有对象。在地图上调用put时,必须决定它将用于给定对象的存储桶。因此,它使用hashCode(模数桶的数量)来决定使用哪个桶。然后,一旦找到存储桶,就必须检查该密钥是否已经存在于地图中。为此,它将存储桶中的每个对象与要放入地图中的对象进行比较。为此,它使用equals。如果找不到该对象,则将其添加到存储桶中。

hashCode未使用,因为它比equals快。之所以使用它是因为它允许在一组存储桶之间分配密钥。计算hashCode一次并将对象与(希望)0比较相同的桶中的一个或两个对象来比较对象和已经存储在地图中的数千个对象的速度要快得多。

答案 2 :(得分:0)

"我进一步尝试Exlpore为什么java在比较两个对象是否相等时检查Hashcode"。 Put方法不只是检查相等性,它试图首先缩小存储区然后使用等于。这就是为什么我们需要将HashCode与Equals结合使用以防止出现问题。

但如果您的唯一目的是检查两个对象之间的相等性,那么您将永远不需要哈希码方法。

Obj1.equals(Obj2)默认情况下永远不会使用hashcode方法。

答案 3 :(得分:0)

它是一种通用类型的契约,因此当我们将对象存储在基于哈希的数据结构中时,我们应始终始终如一地将相同的对象放入哈希表或从哈希表中获取相同的对象。 它是我们创建的一个合同,使得进入/放置过程顺利进行。