LinkedHashMap的内部实现与HashMap的实现有何不同?

2022-09-01 04:02:59

我读到HashMap具有以下实现:

main array 
   ↓
[Entry] → Entry → Entry      ← linked-list implementation
[Entry]
[Entry] → Entry
[Entry]
[null ]

因此,它有一个 Entry 对象数组。

问题:

  1. 我想知道这个数组的索引如何在相同的哈希码但不同的对象的情况下存储多个Entment对象。

  2. 这与实施有何不同?它的map的双重链接列表实现,但它是否维护一个像上面这样的数组,以及它如何存储指向下一个和上一个元素的指针?LinkedHashMap


答案 1

HashMap不维护广告顺序,因此它不维护任何双链表。

LinkedHashMap最突出的特点是它保持键值对的插入顺序。LinkedHashMap使用双重Linked List来做到这一点。

LinkedHashMap的条目看起来像这样-

  static class Entry<K, V> {
     K key;
     V value;
     Entry<K,V> next;
     Entry<K,V> before, after;        //For maintaining insertion order    
     public Entry(K key, V value, Entry<K,V> next){
         this.key = key;
         this.value = value;
         this.next = next;
     }
  }

通过使用之前和之后 - 我们跟踪LinkedHashMap中新添加的条目,这有助于我们保持插入顺序。

之前是指LinkedHashMap中的上一个条目,之后是指LinkedHashMap中的下一个条目。

LinkedHashMap

有关图表和分步说明,请参阅 http://www.javamadesoeasy.com/2015/02/linkedhashmap-custom-implementation.html

谢谢。。!!


答案 2

因此,它有一个对象数组。Entry

不完全是。它有一个对象数组。对象具有一个字段,允许将对象链接为链表。EntryHashMap.EntrynextEntry

我想知道这个数组的索引如何在相同的hashCode但不同的对象的情况下存储多个对象。Entry

因为(如问题中的图片所示)对象是链接的。Entry

这与实施有何不同?它的map的双重链接列表实现,但它是否维护一个像上面这样的数组,以及它如何存储指向下一个和上一个元素的指针?LinkedHashMap

在实现中,类通过添加 和 字段来扩展类。这些字段用于将对象组合到记录广告订单的独立双向链接列表中。因此,在类中,每个条目对象都位于两个不同的链中:LinkedHashMapLinkedHashMap.EntryHashMap.EntrybeforeafterLinkedHashMap.EntryLinkedHashMap

  • 有许多通过主哈希数组访问的单链接哈希链。这用于(常规)哈希映射查找。

  • 有一个单独的双链表,其中包含所有条目对象。它按条目插入顺序保存,并在您迭代哈希映射中的条目、键或值时使用。