Java HashMap中的bucket数是什么意思?

Java HashMap中的bucket数是什么意思?,java,collections,hashmap,Java,Collections,Hashmap,我在读关于Hashmap的书 HashMap实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数 如果Hashmap中有10个键值对。假设Hashcode是不同的 每个人都会住在一个桶里,对吗? 或者一个bucket可以有多个键值对 因为bucket在英语中意味着一件大事,许多对象可以驻留在其中。是的,确切地说,每个bucket可以有多个键值对 对象的hashCode()通过以下表达式确定它进入哪个存储桶:object.hashCode()%n,其中n=存储桶总数,%是模运算符

我在读关于Hashmap的书

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

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

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


因为
bucket
在英语中意味着一件大事,许多对象可以驻留在其中。

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

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

大多数情况下,对象会均匀分布在各个存储桶中,但您无法保证它们会去哪里。这取决于数据和hashCode函数

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

还要阅读equals/hashcode合同,这是相关的

Bucket with hashcode 1    Bucket with hashcode 2 and similar
  K and V                    K and V
  K and V                    K and V 
因此,密钥的
hashCode()
决定了kv对进入哪个bucket,在查找时使用相同的
hashCode
来查找kv对


hashCode()
不应返回常量值。因为这意味着所有对象都将在一个bucket中。这与首先不使用
地图
是一样的。由于所有的键-值对都在同一个bucket中,Java必须遍历所有对象才能找到键

在java中,如果在HashMap中存储对象,第一个HashMap实现将调用hashCode()方法来查找bucket位置。然后它将键和值作为条目存储。注意!它还存储密钥,因为它在检索对象时至关重要。两个对象可以有相同的hashcode,因此如果发生这种情况,HashMap将使用相同的bucket位置,并将第二个对象也存储在那里。在内部,它为此使用LinkedList。(不是java.util.LinkedList,而是更简单的实现)

在检索过程中:您有一个key->hashCode()->bucket location->LinkedList中的search by key->returning object

编辑: 因此在同一位置上有一个bucket,但bucket是一个LinkedList,因此它可以存储多个条目。因此bucket的数量是Hashmap的容量,它描述了在不将它们链接到列表中的情况下可以存储多少个条目。

你可以在这里找到一篇很棒的文章和更详细的解释:

你是说,bucket可以有多个键值对,它们有不同的hashcode。@我想说bucket就是hashcode。所有具有相同哈希代码的对象都属于该类bucket@PrasadKharkar
hashCode()
可以大于存储桶的数量。模数运算符通常从hashCode中分配bucket。@vikingsteve,这是一个新的学习方法。我告诉了我从凯西·塞拉的书中学到的东西。你能用一个好的链接详细说明一下吗?“对象的hashCode()决定它进入哪个bucket”——这有点误导。正如您在下一句中指出的,hashCode()返回的是“hash code”,而不是bucket编号/索引。模运算符是给出铲斗的运算符。hashcode不是bucket,bucket也不是hashcode。哈希代码是哈希代码,对象的hashCode()实现之外的一些代码(百分比)决定了bucket(其索引)。答案是正确的。引起混淆的只是术语上的细微错误。HashMap中的存储桶数总是2的幂。这里有一些很好的信息,但您所写的概念是错误的,而不是第一段。