LinkedHashSet 是基于 LinkedHashMap 来实现的,所以其迭代时可以采用插入顺序或者访问顺序。
LinkedHashSet 的源码很简单,但需要搞清楚 HashMap,LinkedHashMap,HashSet 三者的源码。
HashMap 的源码分析:http://blog.csdn.net/yx0628/article/details/79323985
LinkedHashMap 的源码分析:http://blog.csdn.net/yx0628/article/details/79331515
HashSet 的源码分析:http://blog.csdn.net/yx0628/article/details/79333718
构造函数
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);
}
由于 HashSet 在构造函数中显性的指出了是由 HashMap 实现的,但是看上边几个 LinkedHashSet 的构造函数,没有出现 LinkedHashMap 的身影,那是因为在 HashSet 的构造函数中,有 LinkedHashSet 的实现:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
所以使用 super 来调用父类的构造函数,传入第三个参数 true,即可实现通过 LinkedHashMap 来构造。