集合系列 Set:LinkedHashSet

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 作爲最終實現,從而實現了對插入元素順序的維護。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章