Java集合框架分析(五)LinkedHashMap分析

LinkedHashMap简介
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
复制代码继承自 HashMap,一个有序的 Map 接口实现,这里的有序指的是元素可以按插入顺序或访问顺序排列;与 HashMap 相比,因为 LinkedHashMap 是继承自 HashMap,因此LinkedHashMap,同样是基于散列表实现。同时实现了 Serializable 和 Cloneable 接口,支持序列化和克隆。并且同样不是线程安全的。区别是其内部维护了一个双向循环链表,该链表是有序的,可以按元素插入顺序或元素最近访问顺序 (LRU) 排列。
LinkedHashMap数据结构
LinkedHashMap 不仅像 HashMap 那样对其进行基于哈希表和单链表的 Entry 数组+ next 链表的存储方式,而且还结合了 LinkedList 的优点,为每个 Entry 节点增加了前驱和后继,并增加了一个为 header 头结点,构造了一个双向循环链表。也就是说,每次 put 进来 KV,除了将其保存到对哈希表中的对应位置外,还要将其插入到双向循环链表的尾部。

上图是 LinkedHashMap 的全部数据结构,包含散列表和循环双向链表,由于循环双向链表线条太多了,不好画,简单的画了一个节点(黄色圈出来的)示意一下,注意左边的红色箭头引用为 Entry 节点对象的 next 引用(散列表中的单链表),绿色线条为 Entry 节点对象的 before, after 引用(循环双向链表的前后引用);

上图专门把循环双向链表抽取出来,直观一点,注意该循环双向链表的头部存放的是最久访问的节点或最先插入的节点,尾部为最近访问的或最近插入的节点,迭代器遍历方向是从链表的头部开始到链表尾部结束,在链表尾部有一个空的 header 节点,该节点不存放 key-value 内容,为 LinkedHashMap 类的成员属性,循环双向链表的入口;
LinkedHashMap源码
上面是分析 LinkedHashMap 源码的常规知识点,了解一下,才能更好的分析它的源码,下面我们便开始正式的进行分析工作。
属性:
//属性设置,序列化ID
private static final long serialVersionUID = 3801124242820219131L;
//双向链表的头部
private transient LinkedHashMapEntry<K,V> header;
//迭代的时候所用到的顺序,如果为FALSE,则按照插入的时候顺序
private final boolean accessOrder;
复制代码这些属性虽然简单,但是比较重要,一开始就直接详细说明,不大好理解,等我们分析完了代码再来回顾一下它们所表示的意思。我们来分析分析它的构造函数。
构造器分析
设置初始容量和加载因子的构造器
/**

  • 设置初始容量和加载因子的构造器
    /
    public LinkedHashMap(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor);
    accessOrder = false;
    }
    复制代码设置初始容量的构造器
    /
    *
  • 设置初始容量的构造器
  • @param initialCapacity the initial capacity
  • @throws IllegalArgumentException if the initial capacity is negative
    /
    public LinkedHashMap(int initialCapacity) {
    super(initialCapacity);
    accessOrder = false;
    }
    复制代码默认的空参数的构造器,默认容量为16以及加载因子为0.75
    /
    *
  • 默认的空参数的构造器,默认容量为16以及加载因子为0.75
  • with the default initial capacity (16) and load factor (0.75).
    /
    public LinkedHashMap() {
    super();
    accessOrder = false;
    }
    复制代码使用一个现有的Map来构造LinkedHashMap
    /
    *
  • 使用一个现有的Map来构造LinkedHashMap
  • @param m the map whose mappings are to be placed in this map
  • @throws NullPointerException if the specified map is null
    /
    public LinkedHashMap(Map<? extends K, ? extends V> m) {
    super(m);
    accessOrder = false;
    }
    复制代码设定迭代顺序的构造器
    /
    *
  • 设定迭代顺序的构造器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值