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

标签 java hashmap hashcode hash-function

根据我的理解,我认为:

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

我说得对吗?

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

有人可以解释一下HashMap内部如何使用对象的哈希码吗?

最佳答案

HashMap 的工作方式如下(这有点简化,但它说明了基 native 制):

它有许多“存储桶”,用于存储键值对。每个存储桶都有一个唯一的编号 - 这就是标识该存储桶的编号。当你将一个键值对放入map中时,hashmap会查看该键的哈希码,并将该键值对存储在其标识符为该键的哈希码的桶中。例如:键的哈希码是235 -> 该键值对存储在235号桶中。(注意一个桶可以存储多个键值对)。

当您在 HashMap 中查找值时,通过给它一个键,它会首先查看您提供的键的哈希码。然后,hashmap 将查找相应的存储桶,然后通过使用 equals() 进行比较,将您提供的 key 与存储桶中所有对的 key 进行比较。

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

通过上面的机制,你也可以看出对key的hashCode()equals()方法有什么要求:

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

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

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

相关文章:

java - 适用于Java 1000*1000矩阵的数据结构。

java - 如何将 JFXPanel 添加到现有的 swing 应用程序

java - 以整数作为键和值的 HashMap 需要很长时间才能完成工作

java - 为什么我的 HashMap 有重复的键?

Java,Object.hashCode() 结果在所有 JVM/系统中都是常量?

java - 使用 GridBagLayout 调整大小不当

java - 在Java Servlet中,cookie.getMaxAge()始终返回-1

java - 如何清除散列映射<string,string> 值?

java - 即使没有 "mapping"也使用 Java HashMap ?

c# - 如何为结构实现 base.GetHashCode()?