【发布时间】: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 并且还维护了after 和 before 引用条目的方式使得 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