LinkedHashMap
1.为什么用LinkedHashMap
HashMap 的输出顺序与输入顺序不一致
LinkedHashMap 的输出顺序是有序的
2.LinkedHashMap的底层
LinkedHashMap继承了HashMap,实现了Map接口
LinkedHashMap可以认为是HashMap+LinkedList,
也就是说,它使用HashMap操作数据结构,也用LinkedList维护插入元素的先后顺序。
LinkedHashMap和HashMap的区别在于他们的基本数据机构Entry节点上,它的Entry内部类继承了HashMap的Node类,并且多了两个Entry类型的before,after字段。相当于有了链表的功能。
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);
}
}
3.LinkedHashMap的accessOrder字段
accessOrder = false,插入顺序,put元素的时候会put到链表的尾部
accessOrder = true,访问顺讯,put元素或者访问元素的时候会把当前元素放到链表的尾部,
代表最近访问的元素在尾部,可以用来实现LRU算法。
4. 底层实现
#1 那么LinkedHashMap是如何实现LinkedList的功能的
- 首先LinkedHashMap 中有两个字段head,tail字段指向链表的头尾节点,
- LinkedHashMap没有重写HashMap的put方法,
而是重写了HashMap中的newNode()方法,重写后的方法会将新创建的节点插入LinkedList的尾部,
#2 那么LinkedHashMap是如何实现LRU
- LinkedHashMap有一个字段accessOrder
accessOrder = false:LinkedList的节点顺序是插入顺序
accessOrder = true:LinkedList的节点顺序是访问顺序- HashMap中有三个空方法
void afterNodeAccess(Node<K,V> p) { }
void afterNodeInsertion(boolean evict) { }
void afterNodeRemoval(Node<K,V> p) { }- LinkedHashMap重写了这三个方法