LinkedHashMap详解(基于jdk1.8)
LinkedHashMap集合
LinkedHashMap是具有HashMap的特征:包括默认值、扩容机制…
唯一不同的是:LinkedHashMap能保证数据有序性(这里是插入有序,还有一个访问顺序):
插入有序:根据put的顺序
访问有序:使用到get()方法后,该键值对放将会被放在最后,每当被访问,就会排在最后。
实现上LinkedHashMap特有的属性:
底层数据结构是使用了HashMap的哈希表结构,即数组+链表;链表维护了迭代的顺序。
LinkedHashMap的Entry实体中新增before和after属性是用来构建双向链表的;
LinkedHashMap特点:
- 不可以存储重复的数据(Value键会发生新值覆盖旧值);
- Key和Value分别可以存储最多一个NULL值;
- 存储的数据有序,分为插入有序和访问有序;
LinkedHashMap是线程不安全的。若多线程访问,会抛出ConcurrentModificationException的异常。
线程安全需要使用HashTable和ConcurrentHashMap或者使用Collections工具类中的SynchronizedMap方法进行线程同步。
LinkedHashMap源码分析
继承关系
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
由继承关系可以看出,LinkedHashMap是HashMap的子类,并且都实现了Map接口。
属性
//双向链表的头结点
transient LinkedHashMap.Entry<K,V> head;
//双向链表的尾结点
transient LinkedHashMap.Entry<K,V> tail;
//Boolean类型,顺序选择的参数
final boolean accessOrder;
Entry结点
//Entry结点及相较于HashMap的Entry结点的不同。
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>