【深入理解java集合系列】LinkedHashSet實現原理

1.    LinkedHashSet概述:

   LinkedHashSet是具有可預知迭代順序的Set接口的哈希表和鏈接列表實現。此實現與HashSet的不同之處在於,後者維護着一個運行於所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,該迭代順序可爲插入順序或是訪問順序。

   注意,此實現不是同步的。如果多個線程同時訪問鏈接的哈希Set,而其中至少一個線程修改了該Set,則它必須保持外部同步。

 

2.    LinkedHashSet的實現:

   對於LinkedHashSet而言,它繼承與HashSet、又基於LinkedHashMap來實現的。

   LinkedHashSet底層使用LinkedHashMap來保存所有元素,它繼承與HashSet,其所有的方法操作上又與HashSet相同,因此LinkedHashSet 的實現上非常簡單,只提供了四個構造方法,並通過傳遞一個標識參數,調用父類的構造器,底層構造一個LinkedHashMap來實現,在相關操作上與父類HashSet的操作相同,直接調用父類HashSet的方法即可。LinkedHashSet的源代碼如下:

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

    private static final long serialVersionUID = -2851667679971038690L;

    /**
     * 構造一個帶有指定初始容量和加載因子的新空鏈接哈希set。
     *
     * 底層會調用父類的構造方法,構造一個有指定初始容量和加載因子的LinkedHashMap實例。
     * @param initialCapacity 初始容量。
     * @param loadFactor 加載因子。
     */
    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }

    /**
     * 構造一個帶指定初始容量和默認加載因子0.75的新空鏈接哈希set。
     *
     * 底層會調用父類的構造方法,構造一個帶指定初始容量和默認加載因子0.75的LinkedHashMap實例。
     * @param initialCapacity 初始容量。
     */
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }

    /**
     * 構造一個帶默認初始容量16和加載因子0.75的新空鏈接哈希set。
     *
     * 底層會調用父類的構造方法,構造一個帶默認初始容量16和加載因子0.75的LinkedHashMap實例。
     */
    public LinkedHashSet() {
        super(16, .75f, true);
    }

    /**
     * 構造一個與指定collection中的元素相同的新鏈接哈希set。
     * 
     * 底層會調用父類的構造方法,構造一個足以包含指定collection
     * 中所有元素的初始容量和加載因子爲0.75的LinkedHashMap實例。
     * @param c 其中的元素將存放在此set中的collection。
     */
    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }
}


在父類HashSet中,專爲LinkedHashSet提供的構造方法如下,該方法爲包訪問權限,並未對外公開。

/**
     * 以指定的initialCapacity和loadFactor構造一個新的空鏈接哈希集合。
     * 此構造函數爲包訪問權限,不對外公開,實際只是是對LinkedHashSet的支持。
     *
     * 實際底層會以指定的參數構造一個空LinkedHashMap實例來實現。
     * @param initialCapacity 初始容量。
     * @param loadFactor 加載因子。
     * @param dummy 標記。
     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
	map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
    }

由上述源代碼可見,LinkedHashSet通過繼承HashSet,底層使用LinkedHashMap,以很簡單明瞭的方式來實現了其自身的所有功能。


參考:http://zhangshixi.iteye.com/blog/673319

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