了解java

时间:2015-07-29 11:00:33

标签: java hashmap linkedhashmap

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

LinkedHashMap有两个主要属性1) 标题 ,这是一个 LinkedHashMap.Entry 节点。 2)继承 ,即 HashMap.Entry []数组。 现在LinkedHashMap中的 在运行时分配了 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 ,并维护 之前 标题 的em> 指向最后一个元素,最后一个元素 >指向 标题 形成圈子。

现在,当我们创建任一Maps的实例(使用新构造函数)时,没有为 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方便参考。我明白真正的顺序不一样。我发现这个数据结构非常复杂 - 这么多参考文献。它具有完全不同的双链表,并且用于不同的目的,也是普通hashmap的单链表,并且在同一Entry中也是如此。我的理解是否正确?

enter image description here

1 个答案:

答案 0 :(得分:1)

你已经很好地挖掘了代码,这很棒!但是LinkedHashMap并不像你想要的那样复杂。它实际上是HashMap的一个非常简单的扩展,保留元素添加顺序的唯一目的†

  

该方法的前三行实际上将 HashMap.Entry 转换为 LinkedHashMap.Entry ,并且还维护条目之前和之后的引用

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

的HashMap

enter image description here

LinkedHashMap的

enter image description here

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

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

来自JavaArticles的图片。