LinkedHashSet
LinkedHashSet
- LinkedHashSet 是 Java 集合框架中的一个类,它继承自 HashSet,并实现了 Set 接口
- LinkedHashSet 的特点是 既具有 HashSet 的高效性,又维护了元素的插入顺序
特点
- 基于哈希表和链表实现
- LinkedHashSet 内部使用 LinkedHashMap 来存储元素。
- 哈希表用于快速查找元素,链表用于维护元素的插入顺序
- 不允许重复元素
- LinkedHashSet 中的元素是唯一的,如果尝试添加重复元素,添加操作会被忽略。
- 元素的唯一性是通过 equals() 和 hashCode() 方法来判断的
- 维护插入顺序
- LinkedHashSet 会按照元素的插入顺序维护元素的顺序。
- 遍历 LinkedHashSet 时,元素的顺序与插入顺序一致
- 允许 null 元素
- LinkedHashSet 允许存储 null 值,但只能存储一个 null
- LinkedHashSet 不是线程安全的
常用方法
LinkedHashSet 实现了 Set 接口,因此支持 Set 的所有方法
LinkedHashSet 的底层实现
- LinkedHashSet 的底层实现是基于 LinkedHashMap 的
- LinkedHashSet 通过使用 LinkedHashMap 来实现元素的存储和插入顺序的维护
- 元素的键是 LinkedHashSet 的元素,值是一个固定的 PRESENT 对象(private static final Object PRESENT = new Object())
-
构造方法
-
默认构造方法,创建一个默认初始容量为 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,它结合了哈希表和双向链表的特性
-
哈希表
- 哈希表用于快速查找元素,时间复杂度为 O(1)。
- 哈希表的每个桶(Bucket)中存储的是 LinkedHashMap.Entry 对象
-
双向链表
- 双向链表用于维护元素的插入顺序。
- 每次添加元素时,元素会被插入到链表的末尾。
- 遍历 LinkedHashSet 时,元素的顺序与插入顺序一致
-
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:指向后一个节点(用于双向链表)
-
添加元素
-
当调用 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() 方法 }
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~