Java集合框架源碼解析之LinkedHashSet

閱讀本節內容需要讀者對 HashMap 、HashSet 和 LinkedHashMap 的源碼有所瞭解,因爲 LinkedHashSet 的內部實現都是來自於這三個容器類,其內部源碼十分簡單,簡單到它只有一個成員變量、四個構造函數、一個 Set 接口的方法

如果你想多瞭解下這三個容器類,可以從這裏獲得:Java集合框架源碼解析

LinkedHashSet 的所有源碼如下所示

package java.util;

public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {

    //序列化ID
    private static final long serialVersionUID = -2851667679971038690L;

    //自定義初始容量與裝載因子
    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);
    }

    //並行遍歷迭代器
    @Override
    public Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED);
    }

}

LinkedHashSet 繼承於 HashSet,而 LinkedHashSet 調用的父類構造函數均是

    private transient HashMap<E,Object> map;
    
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

即 LinkedHashSet 底層是依靠 LinkedHashMap 來實現數據存取的,而 LinkedHashMap 繼承於 HashMap,在內部自己維護了一條雙向鏈表用於保存元素的插入順序,因此使得 LinkedHashSet 也具有了存取有序,元素唯一的特點

關於 LinkedHashSet 的源碼實在也沒什麼好講的,它的實現都是依靠其他容器類來組合支持的,所以如果想了解 LinkedHashSet ,就只能先去了解 HashMap 、HashSet 和 LinkedHashMap 的源碼

如果想多瞭解一些 Java 的集合框架源碼解析,可以看這裏:Java集合框架源碼解析

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