文章目录
LinkHashMap数据结构分析
LinkHashMap相对HashMap,记录了元素的插入顺序,在遍历时,可以根据元素的插入顺序进行反问,LinkHashMap的顺序是基于双向链表实现的,因而LinkHashMap同时具备栈和队列的基础功能。
数据结构如下:
LinkedHashMap会将元素串起来,形成一个双链表结构。可以看到,其结构在HashMap结构上增加了链表结构。数据结构为(数组 + 单链表 + 红黑树 + 双链表),图中的标号是结点插入的顺序。注意,在图中未展现出红黑树的特征,这个可以参照HashMap的数据结构。
类定义
下面先看看LinkedHashMap的基本成员属性,具体源码如下:
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {
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);
}
}
// 链表头结点
transient LinkedHashMap.Entry<K,V> head;
// 链表尾结点
transient LinkedHashMap.Entry<K,V> tail;
// 访问顺序,如果为false,表示根据插入顺序进行访问
// 如果为true表示之后访问顺序按照元素的访问顺序进行,不按照之前的插入顺序。
final boolean accessOrder;
}
从源码中看到,LinkedHashMap中定义了Entry内部类,继承自HashMap.Node节点,具备Node的相关特性,同时还定义了Entry<K,V> before, after;
,根据插入顺序用于索引遍历成员元素,在LinkedHashMap内部还定义了head和tail成员属性,用于记录整个双向链表的收尾节点,用于实现双向遍历。
LinkedHashMap继承自HashMap,具有HashMap的全部特性,下面结合源码分析LinkedHashMap的双向链表特性
linkNodeLast 插入双链表尾部
LinkedHashMap重写了HashMap的newNode和newTreeNode方法:
// 当桶中结点类型为HashMap.Node类型时,调用此函数
Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
// 生成Node结点
LinkedHashMap.Entry<K,V> p =
new LinkedHashMap