Java HashMap如何处理具有相同散列代码的不同对象?
根据我的理解,我认为:
- 两个对象具有相同的哈希码是完全合法的。
- 如果两个对象相等(使用equals()方法),则它们具有相同的哈希码。
- 如果两个对象不相等,则它们不能具有相同的哈希码
我对么?
现在,如果正确,我将遇到以下问题:HashMap
内部使用对象的哈希码。因此,如果两个对象可以具有相同的哈希码,那么如何HashMap
跟踪它使用的键?
有人可以解释HashMap
内部如何使用对象的哈希码吗?
回答:
哈希图的工作方式如下(这有点简化,但是它说明了基本机制):
它具有多个“存储桶”,用于存储键值对。每个存储桶都有一个唯一的数字-标识存储桶。将键值对放入地图时,哈希图将查看键的哈希码,并将该对存储在其标识符为键的哈希码的存储桶中。例如:密钥的哈希码为235->该对存储在存储区号235中。(请注意,一个存储区可以存储多于一个键值对)。
当你在哈希图中查找值时,通过为其提供键,它将首先查看你提供的键的哈希码。哈希图随后将查看相应的存储桶,然后将你提供的密钥与存储桶中所有对的密钥进行比较,方法是将它们与进行比较equals()
。
现在,你将看到如何在映射中查找键值对非常有效:通过键的哈希码,hashmap可以立即知道要在哪个存储桶中查找,因此只需要针对该存储桶中的内容进行测试。
查看上述机制,你还可以看到对键hashCode()
和equals()
方法有什么要求:
如果两个键相同(在比较它们时
equals()
返回true
),则它们的hashCode()方法必须返回相同的数字。如果键违反了此规则,那么相等的键可能会存储在不同的存储桶中,并且哈希图将无法找到键值对(因为它将在同一存储桶中查找)。如果两个键不同,那么它们的哈希码是否相同也没关系。如果它们的哈希码相同,它们将存储在相同的存储桶中,在这种情况下,哈希图将用于equals()区分它们。
以上是 Java HashMap如何处理具有相同散列代码的不同对象? 的全部内容, 来源链接: utcz.com/qa/409438.html