参考:
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)