LinkedHashMap源码阅读
首先看名字,大概就知道了它的特性,首先具有Linked链表的访问有序,又具有HashMap的快速访问特性。
对于LinkedHashMap可以认为是HashMap和LinkedList两者相结合。
基本实现思想就是多态,重写继承的父类HashMap中的方法。
//LinkedHashMap的结构
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
{
//只定义了两个属性:
//双向链表的头节点
private transient Entry<K,V> header;
//true表示最近最少使用次序,false表示插入顺序
private final boolean accessOrder;
//...
}
LinkedHashMap一共提供了五个构造方法,其中四个都是默认accessOrder为false,表示 默认采用插入顺序维持去除键值对的次序,第五个可由程序员自定义accessOrder
既然LinkedHashMap继承了HashMap那么,看看它做了什么,才能维护这个顺序:
首先Entry中的属性:
K key
V value
Entry<K,V> next
int hash
Entry<K,V> before
Entry<K,V> after
前四个是继承Map.Entry中的,后面两个before和after是用来维护Entry的插入顺序。
注意: next是用于维护HashMap制定table位置上连接的Entry的顺序
HashMap中有好几个给LinkedHashMap回调的方法,在它本身是空实现。
// Callbacks to allow LinkedHashMap post-actions
void afterNodeAccess(Node<K,V> p) { }
void afterNodeInsertion(boolean evict) { }
void afterNodeRemoval(Node<K,V> p) { }
LinkedHashMap对上面的方法进行了重写,做的操作就是对链表的操作。