LInkedHashSet这个容器不知道大家在平时的工作用的多吗,反正我基本上没有用过,所以,本文主要对于它的特点、使用场景、实现原理,做一个讲解,希望对大家平时的工作有所帮助。
LinkedHashSet是一个基于LinkedHashMap实现的有序去重集合列表。

以上是LinkedHashSet的类结构图:
说明: 创建一个空的容器列表,默认的初始容量为16,负载因子为0.75
说明:创建一个指定初始容量和负载因子的容器
说明:向集合中添加元素
说明:向集合中删除元素
说明:清空集合元素
说明:返回集合中元素的数量
- @Test
- public void test1() {
- Set
set = new LinkedHashSet<>(); - set.add(5);
- set.add(4);
- set.add(5);
- set.add(3);
- set.add(1);
- set.add(9);
- //正顺序遍历
- System.out.print("遍历:");
- set.forEach(item -> {
- System.out.print(item + " ");
- });
- }
运行结果:
2.验证LinkedHashSet存储null值
- @Test
- public void test2() {
- Set
set = new LinkedHashSet<>(); - set.add(null);
- set.add(5);
- System.out.println(set);
- }
运行结果:

LinkedHashSet底层是一个 LinkedHashMap,底层维护了一个数组+双向链表。它根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序, 这使得元素看起来是以插入顺序保存的。
本文主要从源码角度看下LinkedhashSet确实是依赖于LinkedHashMap,具体的逻辑还是要关注LinkedHashMap的实现。
- public class LinkedHashSet
- extends HashSet
- implements Set
, Cloneable, java.io.Serializable { -
-
- public LinkedHashSet(int initialCapacity, float loadFactor) {
- super(initialCapacity, loadFactor, true);
- }
-
-
- public LinkedHashSet(int initialCapacity) {
- super(initialCapacity, .75f, true);
- }
-
-
- public LinkedHashSet() {
- super(16, .75f, true);
- }
-
-
- public LinkedHashSet(Collection extends E> c) {
- super(Math.max(2*c.size(), 11), .75f, true);
- addAll(c);
- }
- }

LinkedHashSet主要适用于对于元素的添加顺序读取有要求的场景,比如FIFO这样的场景。
至于性能方面,大家也不用太过于担心,LinkedHashSet插入性能略低于HashSet,但在迭代访问set里面的全部元素时有很好的性能。