Bootstrap

LinkedHashMap和LinkedHashSet源码解析

参考:
Java编程的逻辑
https://blog.csdn.net/blingfeng/article/details/79974169

LinkedHashMap(JDK1.8)

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

是HashMap的子类,但可以保持元素按插入或访问有序,这与TreeMap按键排序不同

内部多了一个双向链表维护键值对的顺序,每个键值对既位于哈希表中,也位于这个双向链表中。

1 应用场景

  • 保持插入顺序

比如一个配置文件,其中有一些键值对形式的配置项,但其中有一些键是重复的,希望保留最后一个值,但还是按原来的键顺序输出,LinkedHashMap就是一个合适的数据结构。

比如希望的数据模型可能就是一个Map,但希望保持添加的顺序;
比如一个购物车,键为购买项目,值为购买数量,按用户添加的顺序保存。

希望Map能够按键有序,但在添加到Map前,键已经通过其他方式排好序了,这时,就没有必要使用TreeMap了,毕竟TreeMap的开销要大一些。
比如,在从数据库查询数据放到内存时,可以使用SQL的order by语句让数据库对数据排序。

  • 保持访问有序

LRU缓存

2 实现原理

2.1 内部组成

transient LinkedHashMap.Entry<K,V> head;//双向链表的头
transient LinkedHashMap.Entry<K,V> tail;//双向链表的尾
final boolean accessOrder;//表示是按访问顺序还是插入顺序
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);
    }
}

2.2 构造方法

//accessOrder默认为false,即按照插入顺序来连接,true则为按照访问顺序来连接
public LinkedHashMap(int initialCapacity, float loadFactor) 
;