LinkedHashSet 繼承了 HashSet,在此基礎上維護了元素的插入順序。
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable
原理
LinkedHashSet 的源碼非常簡單,只有簡單的四4個構造方法。
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 還維護了元素的插入順序麼?那這部分代碼寫在哪裏呢?
這裏我們要注意一個細節,即 LinkedHashSet 調用的都是 HashSet 的三個參數構造方法,即 HashSet 的這個方法。
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
從上面的代碼我們知道,LinkedHashSet 雖然繼承的是 HashSet,但是其卻使用 LinkedHashMap 做爲實現類。而 LinkedHashMap 則本身維護了元素的插入順序,這在我們接下來解析 LinkedHashMap 源碼的時候會講到。
總結
LinkedHashSet 是在 HashSet 的基礎上,維護了元素的插入順序。雖然 LinkedHashSet 使用了 HashSet 的實現,但其卻調用了 LinkedHashMap 作爲最終實現,從而實現了對插入元素順序的維護。