我正在阅读有关 Hashmap 的信息。
HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数。
如果 Hashmap 中有 10 个键值对。假设哈希码不同。
每个将驻留在一个桶中,对吗?或者一个桶可以有多个键值对?
因为bucket
在英语中意味着可以容纳许多对象的大事。
我正在阅读有关 Hashmap 的信息。
HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数。
如果 Hashmap 中有 10 个键值对。假设哈希码不同。
每个将驻留在一个桶中,对吗?或者一个桶可以有多个键值对?
因为bucket
在英语中意味着可以容纳许多对象的大事。
是的,确切地说,每个桶可以有多个键值对。
对象hashCode()
通过以下表达式确定它进入哪个桶:object.hashCode() % n
,其中 n = 桶的总数并且%
是模运算符。
大多数情况下,对象会很好地分布在存储桶中,但您无法保证它们的去向。这取决于数据和 hashCode 函数。
很明显,当 hashCode 实现不佳时,hashmap 的性能就会下降。
还阅读了相关的 equals / hashcode 合约。
在 java 中,如果您将对象存储在 HashMap 中,首先 HashMap 实现会调用 hashCode() 方法来查找存储桶位置。然后它将两者存储:键和值作为条目。注意!它还存储密钥,因为它在检索对象期间至关重要。两个对象可以具有相同的哈希码,因此如果发生这种情况,则 HashMap 将使用相同的存储桶位置并将第二个对象也存储在那里。在里面它为此使用了一个 LinkedList。(不是java.util.LinkedList,而是更简单的实现)
在检索期间:您有一个键 -> hashCode() -> 存储桶位置 -> 通过键在 LinkedList 中搜索 -> 返回对象。
编辑: 因此您在同一位置有一个存储桶,但存储桶是 LinkedList,因此它可以存储多个条目。所以桶的数量就是 Hashmap 的容量,描述了你可以存储多少 Entries 而无需将它们链接到一个列表中。
你可以在这里找到一篇很棒的文章和更详细的解释: http: //javahungry.blogspot.com/2013/08/hashing-how-hash-map-works-in-java-or.html http://javarevisited.blogspot .com/2011/02/how-hashmap-works-in-java.html
Bucket with hashcode 1 Bucket with hashcode 2 and similar
K and V K and V
K and V K and V
因此hashCode()
,key 决定了 KV 对在哪个桶中,并且在hashCode
查找时用于查找 KV 对。
hashCode()
永远不应该返回一个常量值。因为这意味着所有对象都将位于一个存储桶中。这与一开始不使用 a 是一样Map
的。由于所有键值对都在同一个桶中,Java 必须遍历所有对象才能找到键。