根据我的理解,我认为:
- 两个对象具有相同的哈希码是完全合法的。
- 如果两个对象相等(使用 equals() 方法),则它们具有相同的哈希码。
- 如果两个对象不相等,则它们不能具有相同的哈希码
我说得对吗?
现在如果我是正确的,我有以下问题:
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/