LinkedHashSet

LinkedHashSet

  • LinkedHashSet 是 Java 集合框架中的一个类,它继承自 HashSet,并实现了 Set 接口
  • LinkedHashSet 的特点是 既具有 HashSet 的高效性,又维护了元素的插入顺序

特点

  1. 基于哈希表和链表实现
    • LinkedHashSet 内部使用 LinkedHashMap 来存储元素。
    • 哈希表用于快速查找元素,链表用于维护元素的插入顺序
  2. 不允许重复元素
    • LinkedHashSet 中的元素是唯一的,如果尝试添加重复元素,添加操作会被忽略。
    • 元素的唯一性是通过 equals() 和 hashCode() 方法来判断的
  3. 维护插入顺序
    • LinkedHashSet 会按照元素的插入顺序维护元素的顺序。
    • 遍历 LinkedHashSet 时,元素的顺序与插入顺序一致
  4. 允许 null 元素
    • LinkedHashSet 允许存储 null 值,但只能存储一个 null
  5. LinkedHashSet 不是线程安全的

常用方法

LinkedHashSet 实现了 Set 接口,因此支持 Set 的所有方法

LinkedHashSet 的底层实现

  • LinkedHashSet 的底层实现是基于 LinkedHashMap 的
  • LinkedHashSet 通过使用 LinkedHashMap 来实现元素的存储和插入顺序的维护
  • 元素的键是 LinkedHashSet 的元素,值是一个固定的 PRESENT 对象(private static final Object PRESENT = new Object())
  1. 构造方法

    • 默认构造方法,创建一个默认初始容量为 16,负载因子为 0.75 的 LinkedHashMap

    • 指定初始容量的构造方法,创建一个指定初始容量的 LinkedHashMap

    • 指定初始容量和负载因子的构造方法

    • 基于集合的构造方法

      //指定初始容量的和基于集合的构造方法的负载因子都为0.75
      public LinkedHashSet(int initialCapacity) {
          super(initialCapacity, .75f, true); // 调用 指定初始容量 的构造方法
      }
      
      public LinkedHashSet(Collection<? extends E> c) {
          super(Math.max(2*c.size(), 11), .75f, true); // 调用 基于集合 的构造方法
          addAll(c);
      }
      

LinkedHashSet 的底层是一个 LinkedHashMap,它结合了哈希表和双向链表的特性

  1. 哈希表

    • 哈希表用于快速查找元素,时间复杂度为 O(1)。
    • 哈希表的每个桶(Bucket)中存储的是 LinkedHashMap.Entry 对象
  2. 双向链表

    • 双向链表用于维护元素的插入顺序。
    • 每次添加元素时,元素会被插入到链表的末尾。
    • 遍历 LinkedHashSet 时,元素的顺序与插入顺序一致
  3. LinkedHashMap.Entry

    • LinkedHashMap.Entry 继承自 HashMap.Node,并增加了 before 和 after 指针,用于维护双向链表
    • 每个 Entry 对象包含以下字段
      • K key:元素的键。
      • V value:元素的值(固定为 PRESENT)。
      • Node<K,V> next:指向下一个节点(用于哈希表的链表)。
      • Entry<K,V> before:指向前一个节点(用于双向链表)。
      • Entry<K,V> after:指向后一个节点(用于双向链表)
  4. 添加元素

    • 当调用 LinkedHashSet 的 add(E e) 方法时,实际上是通过 LinkedHashMap 的 put() 方法来实现的。

    • LinkedHashMap 的 put() 方法继承自 HashMap,但重写了 newNode()afterNodeAccess() 等方法,以维护插入顺序

      public V put(K key, V value) {
          return super.put(key, value); // 调用 HashMap 的 put() 方法
      }
      
posted @   QAQ001  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示