Bootstrap

Java集合框架源码分析:LinkedHashMap

一、LinkedHashMap集合简介

LinkedHashMap是Java中的一种特殊的数据结构,它是HashMap的一个子类,并实现了Map接口。LinkedHashMap是HashMap和双向链表的结合体,即在HashMap的基础上,通过双向链表来维护元素的插入顺序或访问顺序。特性如下:

特性描述
是否允许为nullkey和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
;