Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hashmap中的bucket到底是什么?_Java_Linked List_Hashmap_Hashcode_Bucket - Fatal编程技术网

Java hashmap中的bucket到底是什么?

Java hashmap中的bucket到底是什么?,java,linked-list,hashmap,hashcode,bucket,Java,Linked List,Hashmap,Hashcode,Bucket,最近,在一次采访中,我被问到,hashmap中的bucket到底是什么?它是数组还是arraylist还是什么 我弄糊涂了。我知道hashmap是由数组支持的。所以我可以说bucket是一个数组,在开始存储哈希代码时容量为16,并且链表的开始指针指向哪个 我知道hashmap在内部是如何工作的,只是想知道在数据结构方面bucket到底是什么。不,bucket是指数组中的每个元素。在早期的Java版本中,每个bucket都包含一个映射条目的链接列表。在新的Java版本中,每个bucket包含一个目

最近,在一次采访中,我被问到,hashmap中的bucket到底是什么?它是数组还是arraylist还是什么

我弄糊涂了。我知道hashmap是由数组支持的。所以我可以说bucket是一个数组,在开始存储哈希代码时容量为16,并且链表的开始指针指向哪个


我知道hashmap在内部是如何工作的,只是想知道在数据结构方面bucket到底是什么。

不,bucket是指数组中的每个元素。在早期的Java版本中,每个bucket都包含一个映射条目的链接列表。在新的Java版本中,每个bucket包含一个目录树结构或一个目录链表

来自Java 8中的实现说明:

/*
 * Implementation notes.
 *
 * This map usually acts as a binned (bucketed) hash table, but
 * when bins get too large, they are transformed into bins of
 * TreeNodes, each structured similarly to those in
 * java.util.TreeMap. Most methods try to use normal bins, but
 * relay to TreeNode methods when applicable (simply by checking
 * instanceof a node).  Bins of TreeNodes may be traversed and
 * used like any others, but additionally support faster lookup
 * when overpopulated. However, since the vast majority of bins in
 * normal use are not overpopulated, checking for existence of
 * tree bins may be delayed in the course of table methods.
 ...


我希望这可以帮助您更好地理解哈希映射的实现

bucket基本上是一种数据结构,用于操作系统的分页算法。用一种非常通俗的语言

表示特定哈希代码的对象存储在该桶中(基本上可以考虑链表数据结构的头是桶中表示的hash码值)

对象的引用存储在链接列表中,链接列表的头表示哈希代码的值

JVM创建它们,其大小取决于JVM分配的内存

bucket就是一个节点数组。因此,single bucket是类java.util.HashMap.Node的一个实例。每个节点都是一个类似于LinkedList的数据结构,或者可能类似于树映射(因为Java 8),HashMap自行决定什么对性能更有利——将bucket保留为LinkedList或树映射。只有在hashCode()函数设计糟糕的情况下才会选择TreeMap,因为在单个bucket中会放置大量条目。 请参见HashMap中的Bucket外观:

/**
     * The table, initialized on first use, and resized as
     * necessary. When allocated, length is always a power of two.
     * (We also tolerate length zero in some operations to allow
     * bootstrapping mechanics that are currently not needed.)
     */
    transient Node<K,V>[] table;
/**
*表,第一次使用时初始化,并根据需要调整大小
*必要的。分配时,长度始终为2的幂。
*(在某些操作中,我们也允许长度为零,以允许
*当前不需要的引导机制。)
*/
瞬态节点[]表;

所以当我们说hashmap在开始时的容量为16时,它会创建一个16个空间的数组,并将其每个元素称为一个bucket。@dgupta3091是的,但在Java 8实现中,数组是惰性创建的(即仅当第一个条目放入hashmap中时)。@JonnyHenly我刚刚检查了Java 8中的实现,并且没有构造函数初始化数组。它仅由
resize()
(如果数组为空,则由
put
调用)和
readObject(java.io.ObjectInputStream s)
(反序列化)初始化。@Eran这是有道理的,我忘记了设置初始容量的主要原因是为了最小化重新缓存操作的数量。我只是觉得懒洋洋地创建数组很奇怪,例如,在加载方法中创建一个初始容量相当大的hashmap,认为这需要一些时间。之后,您会发现第一次调用put所花费的时间比加载函数所花费的时间要长。也许我的逻辑不对,我很累。谢谢你回复我的评论。@Konstantin是的,每个bucket都是
java.util.HashMap.Node
的一个实例。你需要阅读这个()@JonnyHenly:我特别想知道bucket是什么?在前面提到的问题中,更多的是关于hashcodes和hashmap实现的工作。所以我不认为我的问题是重复的。问题可能相似,但他们寻找的答案不同。