了解 java 中的 acessOrder LinkedHashMap 实现

Understanding acessOrder LinkedHashMap Implementation in java

据我所知,LinkedHashMap 扩展了 HashMap,LinkedHashMap.Entry 也扩展了 HashMap.Entry。

LinkedHashMap 有两个主要属性 1) header 这是一个 LinkedHashMap.Entry节点。 和 2) 继承 tableHashMap.Entry[]数组。 现在LinkedHashMap中的table被赋值为LinkedHashMap.Entry[=的数组61=] 在运行时,这是通过以下方法处理的:

/**
     * This override differs from addEntry in that it doesn't resize the
     * table or remove the eldest entry.
     */
    void createEntry(int hash, K key, V value, int bucketIndex) {
        HashMap.Entry<K,V> old = table[bucketIndex];
        Entry<K,V> e = new Entry<>(hash, key, value, old);
        table[bucketIndex] = e;
        e.addBefore(header);
        size++;
    }

该方法的前三行实际上将HashMap.Entry转换为LinkedHashMap.Entry 并且还维护 after[=29 的引用=]before 的方式使得 before of header 指向顺序中的最后一个元素,最后一个元素的 after 指向 header形成圈.

现在,当我们创建任一 Maps 的实例时(使用新的构造函数),没有为 table[=62= 分配内存] 属性,因为它刚刚初始化为空 table。

Map<String, String> linkedHashMap = new LinkedHashMap<String, String>();

现在假设我们做我们的看跌期权:-

linkedHashMap.put("a", "A");
linkedHashMap.put("b", "B");
linkedHashMap.put("c", "C");

在这些语句之后,我们的 LinkedHashMap 数据结构(table 数组在第一次放置后初始化)看起来像pic.I标记了元素a、b、c,方便参考。我知道真正的顺序是不一样的。我发现这个数据结构非常复杂——有很多参考资料。它具有完全不同且出于不同目的而维护的双链表,以及用于普通哈希图的单链表,并且两者都在同一条目中。我的理解正确吗?

您对代码进行了深入挖掘,这很棒!然而,LinkedHashMap 并不像您 'want' 想象的那么复杂。它实际上是 HashMap 的一个非常简单的扩展,唯一的目的是保留添加元素的顺序†

First three lines of the method actually converts HashMap.Entry to LinkedHashMap.Entry and also maintains the references of after and before of the Entry

这是正确的,LinkedHashMap.Entry 扩展了 HashMap.Entry 但增加了 链接 位通过存储指向 beforeafter 条目的指针。

HashMap

LinkedHashMap

尽管 LinkedHashMap 图看起来复杂得多,但它只是简单地添加了 [=50= 表示的 beforeafter 指针] 箭头。

除了插入顺序之外,LinkedHashMap 还支持访问顺序(排序模式)作为构造函数参数。如果标志设置为 true 遍历列表将 return 元素按访问顺序而不是插入顺序排列。

图片来自 JavaArticles.