HashMap中的桶数是什么意思?

Thi*_*ker 13 java collections hashmap

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

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

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

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

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

vik*_*eve 13

是的,确切地说,每个桶可以具有多个键值对.

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

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

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

另请阅读equals/hashcode合同,这是相关的.

  • "对象的hashCode()确定它进入哪个桶" - 这有点误导.正如您在下一句中指出的那样,hashCode()返回"哈希码"_not_桶号/索引.模数运算符是给出桶的原因.哈希码是_not_一个桶,而桶是_not_哈希码.哈希码是哈希码,对象的hashCode()实现(%)的一些代码_outside_确定桶(其索引).答案是对的.导致混淆的术语只是略微不准确. (2认同)

Bal*_*gyi 5

在 java 中,如果您在 HashMap 中存储一个对象,则首先 HashMap 实现调用 hashCode() 方法来查找存储桶位置。然后它存储两个:键和值作为条目。注意!它存储密钥也是因为它在检索对象期间至关重要。两个对象可以具有相同的哈希码,因此如果发生这种情况,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