Java HashMap如何处理具有相同哈希码的不同对象?

问题:

据我所知,我认为:

  1. 两个对象具有相同的哈希码是完全合法的。
  2. 如果两个对象相等(使用equals()方法),则它们具有相同的哈希码。
  3. 如果两个对象不相等,则它们不能具有相同的哈希码

我对么?
现在如果正确,我有以下问题:
HashMap内部使用对象的哈希码。所以如果两个对象可以具有相同的哈希码,那么HashMap跟踪它使用哪个键呢?
有人可以解释HashMap内部如何使用对象的哈希码?

回答:

一个hashmap是这样的(这有点简化,但它说明了基本的机制):
它有一些“桶”,它用于存储键值对。每个桶都有一个唯一的数字 – 这就是标识桶。当您将一个键值对放入地图时,hashmap将查看密钥的哈希码,并将该对存储在标识符是该密钥的哈希码的桶中。例如:密钥的哈希码是235 – >该对存储在存储桶号235中。(请注意,一个存储桶可以存储多于一个密钥值对)。
当您在hashmap中查找一个值时,通过给它一个键,它将首先查看您给出的密钥的哈希码。然后,hashmap将查看相应的桶,然后将其与桶中所有对的密钥进行比较,将其与equals()进行比较,
现在,您可以看到,如何在地图中查找键值对是非常有效的:由hashmap的哈希代码立即知道要查看哪个存储桶,以便只需对该存储区中的内容进行测试。
查看上述机制,您还可以看到hashCode()equals()键的必要条件:

  • 如果两个键是相同的(equals()返回true,当你比较),他们的hashCode()方法必须返回相同的数字。如果键违反了这一点,那么相等的键可能存储在不同的存储桶中,而哈希马克将无法找到键值对(因为它将在同一个存储区中查找)。
  • 如果两个键不同,那么它们的哈希码是否相同就没关系。如果哈希码相同,则它们将被存储在同一个存储桶中,在这种情况下,哈希表将使用equals()将它们分开。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How does a Java HashMap handle different objects with the same hash code?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

80 − 74 =