【问题标题】:Understanding acessOrder LinkedHashMap Implementation in java了解java中的accessOrder LinkedHashMap实现
【发布时间】:2015-07-29 11:00:32
【问题描述】:

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

LinkedHashMap 有两个主要属性 1) header,它是一个 LinkedHashMap.Entry 节点。 2) 继承 table,即 HashMap.Entry[] 数组。 现在,LinkedHashMap 中的 table 在运行时被分配了 LinkedHashMap.Entry 数组,这由以下方法处理:

/**
     * 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 并且还维护了afterbefore 引用条目的方式使得 before header 的 em> 指向按顺序排列的最后一个元素,最后一个元素的 after 指向页眉形成圆圈。

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

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

现在让我们说我们做我们的puts:-

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

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

【问题讨论】:

    标签: java hashmap linkedhashmap


    【解决方案1】:

    您已经对代码进行了一些很好的挖掘,这太棒了!然而 LinkedHashMap 并不像你“想要”的那么复杂。它实际上是 HashMap 的一个非常简单的扩展,唯一的目的是保留添加元素的顺序†

    该方法的前三行实际上是将HashMap.Entry转换为LinkedHashMap.Entry,并且还维护了Entry的after和before的引用

    这是正确的,LinkedHashMap.Entry 扩展了 HashMap.Entry 但通过存储指向 before 和 @987654327 的指针来添加 linked 位@ 条目。

    哈希映射

    LinkedHashMap

    尽管 LinkedHashMap 图看起来要复杂得多,但它只是添加了由蓝色/红色箭头表示的 beforeafter 指针。

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

    图片来自JavaArticles

    【讨论】:

    • 感谢 JavaArticles 链接。它证明了(虽然在高层次上)我从代码检查中得出的结论。是的,我不希望数据结构复杂。一开始我发现它很复杂 :) 我相信我并不孤单。
    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2013-10-11
    相关资源
    最近更新 更多