| 1.    LinkedHashSet概述:    LinkedHashSet是具有可預(yù)知迭代順序的Set接口的哈希表和鏈接列表實(shí)現(xiàn)。此實(shí)現(xiàn)與HashSet的不同之處在于,后者維護(hù)著一個(gè)運(yùn)行于所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,該迭代順序可為插入順序或是訪問順序。    注意,此實(shí)現(xiàn)不是同步的。如果多個(gè)線程同時(shí)訪問鏈接的哈希Set,而其中至少一個(gè)線程修改了該Set,則它必須保持外部同步。   2.    LinkedHashSet的實(shí)現(xiàn):    對(duì)于LinkedHashSet而言,它繼承與HashSet、又基于LinkedHashMap來實(shí)現(xiàn)的。    LinkedHashSet底層使用LinkedHashMap來保存所有元素,它繼承與HashSet,其所有的方法操作上又與HashSet相同,因此LinkedHashSet 的實(shí)現(xiàn)上非常簡(jiǎn)單,只提供了四個(gè)構(gòu)造方法,并通過傳遞一個(gè)標(biāo)識(shí)參數(shù),調(diào)用父類的構(gòu)造器,底層構(gòu)造一個(gè)LinkedHashMap來實(shí)現(xiàn),在相關(guān)操作上與父類HashSet的操作相同,直接調(diào)用父類HashSet的方法即可。LinkedHashSet的源代碼如下: Java代碼   public class LinkedHashSet<E>      extends HashSet<E>      implements Set<E>, Cloneable, java.io.Serializable {        private static final long serialVersionUID = -2851667679971038690L;        /**      * 構(gòu)造一個(gè)帶有指定初始容量和加載因子的新空鏈接哈希set。      *      * 底層會(huì)調(diào)用父類的構(gòu)造方法,構(gòu)造一個(gè)有指定初始容量和加載因子的LinkedHashMap實(shí)例。      * @param initialCapacity 初始容量。      * @param loadFactor 加載因子。      */      public LinkedHashSet(int initialCapacity, float loadFactor) {          super(initialCapacity, loadFactor, true);      }        /**      * 構(gòu)造一個(gè)帶指定初始容量和默認(rèn)加載因子0.75的新空鏈接哈希set。      *      * 底層會(huì)調(diào)用父類的構(gòu)造方法,構(gòu)造一個(gè)帶指定初始容量和默認(rèn)加載因子0.75的LinkedHashMap實(shí)例。      * @param initialCapacity 初始容量。      */      public LinkedHashSet(int initialCapacity) {          super(initialCapacity, .75f, true);      }        /**      * 構(gòu)造一個(gè)帶默認(rèn)初始容量16和加載因子0.75的新空鏈接哈希set。      *      * 底層會(huì)調(diào)用父類的構(gòu)造方法,構(gòu)造一個(gè)帶默認(rèn)初始容量16和加載因子0.75的LinkedHashMap實(shí)例。      */      public LinkedHashSet() {          super(16, .75f, true);      }        /**      * 構(gòu)造一個(gè)與指定collection中的元素相同的新鏈接哈希set。      *       * 底層會(huì)調(diào)用父類的構(gòu)造方法,構(gòu)造一個(gè)足以包含指定collection      * 中所有元素的初始容量和加載因子為0.75的LinkedHashMap實(shí)例。      * @param c 其中的元素將存放在此set中的collection。      */      public LinkedHashSet(Collection<? extends E> c) {          super(Math.max(2*c.size(), 11), .75f, true);          addAll(c);      }  }  
   在父類HashSet中,專為L(zhǎng)inkedHashSet提供的構(gòu)造方法如下,該方法為包訪問權(quán)限,并未對(duì)外公開。 Java代碼   /**      * 以指定的initialCapacity和loadFactor構(gòu)造一個(gè)新的空鏈接哈希集合。      * 此構(gòu)造函數(shù)為包訪問權(quán)限,不對(duì)外公開,實(shí)際只是是對(duì)LinkedHashSet的支持。      *      * 實(shí)際底層會(huì)以指定的參數(shù)構(gòu)造一個(gè)空LinkedHashMap實(shí)例來實(shí)現(xiàn)。      * @param initialCapacity 初始容量。      * @param loadFactor 加載因子。      * @param dummy 標(biāo)記。      */      HashSet(int initialCapacity, float loadFactor, boolean dummy) {      map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);      }  
    由上述源代碼可見,LinkedHashSet通過繼承HashSet,底層使用LinkedHashMap,以很簡(jiǎn)單明了的方式來實(shí)現(xiàn)了其自身的所有功能。 |