一、LinkedHashMap集合简介
LinkedHashMap是Java中的一种特殊的数据结构,它是HashMap的一个子类,并实现了Map接口。LinkedHashMap是HashMap和双向链表的结合体,即在HashMap的基础上,通过双向链表来维护元素的插入顺序或访问顺序。特性如下:
特性 | 描述 |
---|---|
是否允许为null | key和value都可以取值为null |
是否允许重复 | key重复会覆盖,value允许重复 |
是否有序 | 有序。迭代顺序可以是插入顺序,也可以是访问顺序(通过构造函数或accessOrder属性设置,取值为false:所有的Entry按照插入的顺序排列,取值为true:所有的Entry按照访问的顺序排列) |
是否线程安全 | 非线程安全。需要线程安全时可使用Collections.synchronizedMap或ConcurrentHashMap |
数据结构 | 内部使用数组+双向链表实现,JDK8以后加入了红黑树优化 |
主要用途:
- LRU缓存:通过访问顺序的迭代,可以很容易地实现LRU(最近最少使用)缓存策略。
- 有序映射表:在需要保持元素顺序的场景中使用,如按照时间顺序存储日志信息等。
二、LinkedHashMap集合底层的数据结构
- LinkedHashMap在HashMap的基础上增加了一个双向链表,用于维护元素的顺序。每个Entry节点都包含了前驱节点和后继节点的引用。
- 当元素被插入LinkedHashMap时,会在链表的尾部添加一个新的节点。
- 当元素被访问时(通过get或put方法),LinkedHashMap会将该节点移动到链表的尾部(如果accessOrder为true),以保持访问顺序。
双向链表的存储结构:
/**
* HashMap.Node subclass for normal LinkedHashMap entries.
*/
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);
}
}
三、优缺点
- 优点:
- 保持元素访问顺序:可以按照插入顺序或访问顺序保持元素的顺序。
- 快速访问:底层使用哈希表实现,可以快速进行元素的查找和访问。
- 缺点:
- 占用更多内存:相比普通的HashMap,需要额外的内存来维护链表结构。
- 插入和删除性能略低:由于需要维护链表结构,插入和删除元素时性能会略微降低。
四、参考
- https://blog.csdn.net/shark_chili3007/article/details/107249595
- https://www.cnblogs.com/xrq730/p/5052323.html