在发生哈希冲突的情况下,LinkedHashMap如何维护插入顺序?

问题描述

我知道HashMap的工作方式,并且在发生哈希冲突的情况下,它会在该存储桶中形成一个链表。 我在LinkedHashMap中得到它通过'before'和'after'字段维护插入顺序,但是如果像HashMap中那样存在哈希冲突,它将如何维护插入顺序。

更具体地说,可以在不同的时间间隔插入数组和任何特定存储桶中的值,并且在检索它们时,会不会一团糟?

解决方法

LinkedHashmap维护一个贯穿其所有条目的双向链接列表。这意味着每个条目都知道在其自身之前和之后插入的条目。因此,条目属于哪个bucket并不重要;迭代时,您将按插入顺序获得条目。

我确定您知道Map的概念,它存储由键值对组成的条目。但是,在your comment中,您仅错误地提及了值。

,

每个条目由之前和之后的条目对象组成。即使在哈希冲突的情况下,Collided Entry 也会有它之前的 Entry。 JVM 不需要通过linkedList 的索引或特定的bucket 进行遍历。使用after或before Entry会直接跳转。

static class Entry<K,V> extends HashMap.Node<K,V> {
    Entry<K,V> before,after;
    Entry(int hash,K key,V value,Node<K,V> next) {
        super(hash,key,value,next);
    }
}