我们知道,HashSet内部使用HashMap存储元素,所以HashSet遍历数据时是无序的,要保证插入的元素有序,我们可以使用LinkedHashSet。本节记录LinkedHashSet源码解析,基于JDK1.8。
LinkedHashSet类层级关系如下所示:
LinkedHashSet继承自HashSet。查看LinkedHashSet的构造方法源码会发现内部都是调用父类的HashSet(int initialCapacity, float loadFactor, boolean dummy)
方法:
1 | HashSet(int initialCapacity, float loadFactor, boolean dummy) { |
dummy参数没有任何意义,仅用于和别的入参为(int,float)的构造器区分开。方法内部创建的是LinkedHashMap,所以LinkedHashSet就是用LinkedHashMap来保证插入元素有序的,对LinkedHashMap不熟悉的请参考LinkedHashMap源码解析。
从上面的代码我们还可以发现,LinkedHashSet无法改变linkedHashMap的accessOrder属性值,所以在LinkedHashSet中,元素的顺序只能和插入顺序一致:
1 | LinkedHashSet<String> set = new LinkedHashSet<>(); |
输出顺序和插入顺序一致:
1 | [apple, orange, watermelon, strawberry] |