LinkedHashMap概述
LinkedHashMap是HashMap的子类,内部使用双向链表进行顺序的维护,内部类Entry为HashMap的Node的子类;
底层是散列表和双向链表,插入的顺序是有序的(底层链表致使有序),和HashMap一样,允许key和value为null,初始容量和装载因子对LinkedHashMap的性能影响很大;也是非同步的,也可以调用Collections的synchronizedMap方法使之具有线程安全的能力;
底层数据结构

构造函数
如果accessOrder为true,那么表示将顺序记录为访问顺序,否则为插入顺序,默认为false(即,LinkedHashMap默认使用的是插入顺序);
而正是这一参数并对removeEldestEntry方法进行覆盖便可以快速实现一个简单的LRU缓存;
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
LinkedHashMap有5个构造方法:
LinkedHashMap的域
LinkedHashMap重写的方法
下面的是两个比较重要的;
这就印证了我们的LinkedHashMap底层确确实实是散列表和双向链表:在构建新节点时,构建的是LinkedHashMap.Entry 不再是Node;
put方法
put方法就是HashMap的put方法,在HashMap部分也提到了afterNodeAccess和afterNodeInsertion方法其实是空实现,而在LinkedHashMap中对其进行了实现,Linked的特性也是在这里进行了体现;
//LinkedhHashMap对此方法进行了覆盖
Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
LinkedHashMap.Entry<K,V> p = new LinkedHashMap.Entry<K,V>(hash, key, value, e);
linkNodeLast(p);
return p;
}
//linkNodeLast方法负责双链表的连接:
private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
LinkedHashMap.Entry<K,V> last = tail;
tail = p;
if (last == null)
head = p;
else {
p.before = last;
last.after = p;
}
}
afterNodeAccess
顾名思义,此方法应该在一次访问之后被调用,那么什么算是一次访问呢?LInkedHashMap对此做出了定义:
1.put/putAll/p