Java hashMap是否实现为链表数组
在阅读有关HashMap的文章时,我看到它是作为一个bucket数组实现的?现在这些桶总是链表吗?如果是这样,为什么它们被称为bucket而不是链表?查看的源代码告诉我们,它是作为一个条目数组实现的:Java hashMap是否实现为链表数组,java,hashmap,Java,Hashmap,在阅读有关HashMap的文章时,我看到它是作为一个bucket数组实现的?现在这些桶总是链表吗?如果是这样,为什么它们被称为bucket而不是链表?查看的源代码告诉我们,它是作为一个条目数组实现的: transient Entry[] table; 每个条目都有一个字段next,因此它们创建一个单一的链表结构: static class Entry<K,V> implements Map.Entry<K,V> { final K key; V valu
transient Entry[] table;
每个条目都有一个字段next
,因此它们创建一个单一的链表结构:
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
静态类条目实现Map.Entry{
最终K键;
V值;
进入下一步;
“Bucket”是一个更高级的术语,在文献中和解释哈希映射时使用。在这里,“Bucket”被实现为一个单一的链表。在Java的哈希映射中,Bucket被实现为一个链表(每个
条目
都引用另一个名为下一个的条目)
术语“bucket”指的是一个概念。链表是一个实现细节。Java使用“分离链接”的概念,将其实现为一个链表数组,以避免冲突。
不过,情况并非总是如此。哈希映射可以完全实现为一个数组(线性探测);尽管如此,创建共点的可能性更高
关于你的“bucket”问题,你可以把链表想象成一个bucket。但是,如果你的HashMap实现使用了合适的HashFunction(在HashMap数组中分配值的算法),你的“bucket”最好只有一项。这是什么编程语言?怀疑Java这种假设导致了著名的DoS攻击()。回想起来,链表是bucket实现的糟糕选择,但Java不会改变它。