LinkedHashSet源码解析

我们知道,HashSet内部使用HashMap存储元素,所以HashSet遍历数据时是无序的,要保证插入的元素有序,我们可以使用LinkedHashSet。本节记录LinkedHashSet源码解析,基于JDK1.8。

LinkedHashSet类层级关系如下所示:

QQ20210225-182300@2x

LinkedHashSet继承自HashSet。查看LinkedHashSet的构造方法源码会发现内部都是调用父类的HashSet(int initialCapacity, float loadFactor, boolean dummy)方法:

1
2
3
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

dummy参数没有任何意义,仅用于和别的入参为(int,float)的构造器区分开。方法内部创建的是LinkedHashMap,所以LinkedHashSet就是用LinkedHashMap来保证插入元素有序的,对LinkedHashMap不熟悉的请参考LinkedHashMap源码解析

从上面的代码我们还可以发现,LinkedHashSet无法改变linkedHashMap的accessOrder属性值,所以在LinkedHashSet中,元素的顺序只能和插入顺序一致:

1
2
3
4
5
6
LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("apple");
set.add("orange");
set.add("watermelon");
set.add("strawberry");
System.out.println(set);

输出顺序和插入顺序一致:

1
[apple, orange, watermelon, strawberry]

请作者喝瓶肥宅水🥤

0