Bootstrap

Map接口下的LinkedHashMap详解

LinkedHashMap集合

在这里插入图片描述

LinkedHashMap是具有HashMap的特征:包括默认值、扩容机制…

唯一不同的是:LinkedHashMap能保证数据有序性(这里是插入有序,还有一个访问顺序):
插入有序:根据put的顺序
访问有序:使用到get()方法后,该键值对放将会被放在最后,每当被访问,就会排在最后。
实现上LinkedHashMap特有的属性:

底层数据结构是使用了HashMap的哈希表结构,即数组+链表;链表维护了迭代的顺序。
LinkedHashMap的Entry实体中新增before和after属性是用来构建双向链表的

LinkedHashMap特点:

  • 不可以存储重复的数据(Value键会发生新值覆盖旧值);
  • Key和Value分别可以存储最多一个NULL值;
  • 存储的数据有序,分为插入有序和访问有序;

LinkedHashMap是线程不安全的。若多线程访问,会抛出ConcurrentModificationException的异常
线程安全需要使用HashTableConcurrentHashMap或者使用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>
;