天天看点

LinkedHashMap源码阅读

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的顺序

LinkedHashMap源码阅读
LinkedHashMap源码阅读

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对上面的方法进行了重写,做的操作就是对链表的操作。

参考: Java集合之LinkedHashMap