【发布时间】:2015-04-14 04:35:18
【问题描述】:
我读过一本书
“从hashcode()收到的值被用作存储元素的桶号。”
我怀疑桶是否包含多个元素(具有相同的hashcode值),如何区分元素?
或
是否有可能不止一个元素具有相同的hashcode ?
【问题讨论】:
-
桶可以包含多个元素。容器将使用
equals()来检查它们中的每一个是否都是您要查找的东西。
我读过一本书
“从hashcode()收到的值被用作存储元素的桶号。”
我怀疑桶是否包含多个元素(具有相同的hashcode值),如何区分元素?
或
是否有可能不止一个元素具有相同的hashcode ?
【问题讨论】:
equals() 来检查它们中的每一个是否都是您要查找的东西。
一般来说,有两种方法可以处理两个或多个元素最终位于哈希表中的同一个“桶”中的情况:
一个bucket可以是一个链表(或等价物)并且包含很多元素。这就是HashMap 的工作原理……尽管在 Java 8 中,链表可以是二叉树。
一个桶可以有一个有界的大小,然后“溢出”到另一个桶中。
我怀疑桶是否包含多个元素(具有相同的哈希码值)。如何区分元素?
在 Java 中,HashMap、Hashtable 和相关类使用 key 的 equals 方法来区分具有相同 hashcode 的 key。这就是我们有“hashcode / equals contract”的原因。 (阅读它here。)
是否可能有多个元素具有相同的哈希码?
是的,这是可能的。 Java 的标准哈希表类可以处理它。见上文。
【讨论】:
多个元素可以具有相同的哈希码。在这种情况下,将使用 equals() 方法检查该存储桶中的所有元素,以确定其中一个是否与您要查找的匹配。
【讨论】:
可能有多个元素具有相同的哈希码,因为哈希码的数量是有限的。您可以通过equals() 方法区分元素。
【讨论】: