生活随笔
收集整理的這篇文章主要介紹了
深入Java集合学习系列:LinkedHashSet的实现原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自??深入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,以很簡單明了的方式來實現了其自身的所有功能。
?
3.? 相關說明:
?? 1) 相關HashSet的實現原理,請參考我的上一遍總結:深入Java集合學習系列:HashSet的實現原理。
?? 2)相關HashMap的實現原理,請參考我的上一遍總結:深入Java集合學習系列:HashMap的實現原理。
?
?
總結
以上是生活随笔為你收集整理的深入Java集合学习系列:LinkedHashSet的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。