有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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在英语中的意思是很多对象都可以驻留的一件大事


共 (3) 个答案

  1. # 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. # 2 楼答案

    没错,每个bucket可以有多个键值对

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

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

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

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

  3. # 3 楼答案

    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中。这与不使用Map放在首位是一样的。由于所有的键-值对都在同一个bucket中,Java必须遍历所有对象才能找到键