HashMap中桶的数量是什么意思?

时间:2013-09-05 12:38:59

标签: java collections hashmap

我正在阅读关于Hashmap的内容。

  

HashMap的一个实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数。

如果Hashmap中有10个键值对。假设Hashcode不同。

每个人都会在一个桶里吗? 或者一个桶可以拥有多个键值对?

因为英语中的bucket意味着许多物体可以驻留的大事。

3 个答案:

答案 0 :(得分:13)

是的,确切地说,每个存储桶可以有多个键值对。

对象的hashCode()通过以下表达式确定它进入哪个桶:object.hashCode() % n,其中n =桶的总数,%是模数运算符。

大多数情况下,对象会很好地分布在各个存储桶中,但您无法保证它们的位置。这取决于数据和hashCode函数。

显然,当hashCode实现很差时,hashmap的性能会下降。

同时阅读equals / hashcode合约,这是相关的。

答案 1 :(得分:4)

在java中,如果在HashMap中存储对象,则首先HashMap实现调用hashCode()方法来查找存储桶位置。然后它存储:键和值作为条目。 NB!它存储密钥也是因为它在检索对象时至关重要。两个对象可以具有相同的哈希码,因此如果发生这种情况,那么HashMap将使用相同的存储桶位置并将第二个对象存储在那里。在里面它使用LinkedList。 (不是java.util.LinkedList,而是更简单的实现)

检索期间:您有一个密钥 - > hashCode() - >铲斗位置 - >按键搜索LinkedList - >返回对象。

编辑: 因此,您在同一位置有一个存储桶,但存储桶是LinkedList,因此它可以存储多个条目。因此,桶的数量是Hashmap的容量,并描述了您可以存储的条目数,而无需在列表中链接它们。

你可以在这里找到一篇很棒的文章和更详细的解释: 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

答案 2 :(得分:1)

Bucket with hashcode 1    Bucket with hashcode 2 and similar
  K and V                    K and V
  K and V                    K and V 

因此,密钥的hashCode()决定K V对在哪个桶中进行,并且在查找时使用相同的hashCode来查找K V对。

hashCode()永远不应返回常量值。因为这意味着所有对象都将在一个桶中。这与首先​​不使用Map的情况相同。由于所有键值对都在同一个桶中,因此Java必须遍历所有对象才能找到密钥。