java HashMap中的bucket数是什么意思?
我在读关于Hashmap的书
An instance of HashMap has two parameters that affect its performance: initial capacity and load factor. The capacity is the number of buckets in the hash table.
如果Hashmap中有10个键值对。假设Hashcode是不同的
每个人都会住在一个桶里,对吗? 或者一个bucket可以有多个键值对
因为bucket
在英语中的意思是很多对象都可以驻留的一件大事
# 1 楼答案
在java中,如果将对象存储在HashMap中,第一个HashMap实现将调用hashCode()方法来查找bucket位置。然后它将键和值作为条目存储。注意!它还存储密钥,因为它在检索对象时至关重要。两个对象可以有相同的hashcode,因此如果发生这种情况,HashMap将使用相同的bucket位置,并将第二个对象也存储在那里。在内部,它为此使用LinkedList。(不是java.util.LinkedList,而是更简单的实现)
检索期间:您有一个密钥->;hashCode()->;铲斗位置->;按键在LinkedList中搜索->;返回对象
编辑: 因此在同一位置上有一个bucket,但bucket是一个LinkedList,因此它可以存储多个条目。因此bucket的数量是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 楼答案
没错,每个bucket可以有多个键值对
对象的
hashCode()
通过以下表达式确定它进入哪个存储桶:object.hashCode() % n
,其中n=存储桶的总数,%
是模运算符大多数情况下,对象会均匀分布在各个存储桶中,但您无法保证它们会去哪里。这取决于数据和hashCode函数
显然,当hashCode实现较差时,hashmap的性能会下降
还要阅读equals/hashcode合同,这是相关的
# 3 楼答案
因此,密钥的
hashCode()
决定了kv对进入哪个bucket,并且在查找时使用相同的hashCode
来查找kv对hashCode()
不应返回常量值。因为这意味着所有对象都将在一个bucket中。这与不使用Map
放在首位是一样的。由于所有的键-值对都在同一个bucket中,Java必须遍历所有对象才能找到键