LinkedHashSet的實現原理


1. LinkedHashSet概述

      LinkedHashSet是具有可預知迭代順序的Set接口的哈希表和鏈接列表實現。此實現與HashSet的不同之處在於,后者維護着一個運行於所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,該迭代順序可為插入順序或是訪問順序。
      注意,此實現不是同步的。如果多個線程同時訪問鏈接的哈希Set,而其中至少一個線程修改了該Set,則它必須保持外部同步。

2. LinkedHashSet的實現

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

 

[java]  view plain  copy
 
  1. public class LinkedHashSet<E>    
  2.     extends HashSet<E>    
  3.     implements Set<E>, Cloneable, java.io.Serializable {    
  4.     
  5.     private static final long serialVersionUID = -2851667679971038690L;    
  6.     
  7.     /**  
  8.      * 構造一個帶有指定初始容量和加載因子的新空鏈接哈希set。  
  9.      *  
  10.      * 底層會調用父類的構造方法,構造一個有指定初始容量和加載因子的LinkedHashMap實例。  
  11.      * @param initialCapacity 初始容量。  
  12.      * @param loadFactor 加載因子。  
  13.      */    
  14.     public LinkedHashSet(int initialCapacity, float loadFactor) {    
  15.         super(initialCapacity, loadFactor, true);    
  16.     }    
  17.     
  18.     /**  
  19.      * 構造一個帶指定初始容量和默認加載因子0.75的新空鏈接哈希set。  
  20.      *  
  21.      * 底層會調用父類的構造方法,構造一個帶指定初始容量和默認加載因子0.75的LinkedHashMap實例。  
  22.      * @param initialCapacity 初始容量。  
  23.      */    
  24.     public LinkedHashSet(int initialCapacity) {    
  25.         super(initialCapacity, .75f, true);    
  26.     }    
  27.     
  28.     /**  
  29.      * 構造一個帶默認初始容量16和加載因子0.75的新空鏈接哈希set。  
  30.      *  
  31.      * 底層會調用父類的構造方法,構造一個帶默認初始容量16和加載因子0.75的LinkedHashMap實例。  
  32.      */    
  33.     public LinkedHashSet() {    
  34.         super(16, .75f, true);    
  35.     }    
  36.     
  37.     /**  
  38.      * 構造一個與指定collection中的元素相同的新鏈接哈希set。  
  39.      *   
  40.      * 底層會調用父類的構造方法,構造一個足以包含指定collection  
  41.      * 中所有元素的初始容量和加載因子為0.75的LinkedHashMap實例。  
  42.      * @param c 其中的元素將存放在此set中的collection。  
  43.      */    
  44.     public LinkedHashSet(Collection<? extends E> c) {    
  45.         super(Math.max(2*c.size(), 11), .75f, true);    
  46.         addAll(c);    
  47.     }    
  48. }    

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

 

 

[java]  view plain  copy
 
  1. /**  
  2.      * 以指定的initialCapacity和loadFactor構造一個新的空鏈接哈希集合。  
  3.      * 此構造函數為包訪問權限,不對外公開,實際只是是對LinkedHashSet的支持。  
  4.      *  
  5.      * 實際底層會以指定的參數構造一個空LinkedHashMap實例來實現。  
  6.      * @param initialCapacity 初始容量。  
  7.      * @param loadFactor 加載因子。  
  8.      * @param dummy 標記。  
  9.      */    
  10.     HashSet(int initialCapacity, float loadFactor, boolean dummy) {    
  11.     map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);    
  12.     }   


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM