gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:16:49 26 4
gpt4 key购买 nike

根据我的理解,我认为:

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

我说的对吗?

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

谁能解释一下HashMap是如何在内部使用对象的hashcode的?

最佳答案

hashmap 是这样工作的(这有点简化,但它说明了基 native 制):

它有许多“桶”,用于在其中存储键值对。每个桶都有一个唯一的数字 - 这就是标识桶的原因。当你把一个key-value对放入map中时,hashmap会查看key的hash code,并将pair存放在标识符为key的hash code的bucket中。例如:key的hash码是235 -> 对存储在235号桶中。(注意一个桶可以存储多于一个键值对)。

当你在 hashmap 中查找一个值时,通过给它一个键,它会首先查看你给出的键的哈希码。然后 hashmap 将查看相应的桶,然后它将您提供的键与桶中所有对的键进行比较,方法是将它们与 equals() 进行比较。

现在您可以看到这对于在映射中查找键值对非常有效:通过键的哈希码, HashMap 立即知道要在哪个存储桶中查找,因此它只需要针对其中的内容进行测试那个桶。

看上面的机制,也可以看出keys的hashCode()equals()方法有什么要求:

  • 如果两个键相同(比较时equals()返回true),它们的hashCode()方法必须返回相同的数字。如果键违反了这一点,那么相等的键可能会存储在不同的桶中,并且 HashMap 将无法找到键值对(因为它会在同一个桶中查找)。

  • 如果两个键不同,那么它们的哈希码是否相同都没有关系。如果它们的哈希码相同,它们将存储在同一个桶中,在这种情况下,hashmap 将使用 equals() 来区分它们。

关于java - Java HashMap 如何处理具有相同哈希码的不同对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6493605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com