生活随笔
收集整理的這篇文章主要介紹了
深入Java集合学习系列:LinkedHashSet的实现原理
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)載自??深入Java集合學(xué)習(xí)系列:LinkedHashSet的實(shí)現(xiàn)原理
?
1.??? LinkedHashSet概述:
???LinkedHashSet是具有可預(yù)知迭代順序的Set接口的哈希表和鏈接列表實(shí)現(xiàn)。此實(shí)現(xiàn)與HashSet的不同之處在于,后者維護(hù)著一個(gè)運(yùn)行于所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,該迭代順序可為插入順序或是訪(fǎng)問(wèn)順序。
???注意,此實(shí)現(xiàn)不是同步的。如果多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)鏈接的哈希Set,而其中至少一個(gè)線(xiàn)程修改了該Set,則它必須保持外部同步。
?
2.??? LinkedHashSet的實(shí)現(xiàn):
???對(duì)于LinkedHashSet而言,它繼承與HashSet、又基于LinkedHashMap來(lái)實(shí)現(xiàn)的。
???LinkedHashSet底層使用LinkedHashMap來(lái)保存所有元素,它繼承與HashSet,其所有的方法操作上又與HashSet相同,因此LinkedHashSet?的實(shí)現(xiàn)上非常簡(jiǎn)單,只提供了四個(gè)構(gòu)造方法,并通過(guò)傳遞一個(gè)標(biāo)識(shí)參數(shù),調(diào)用父類(lèi)的構(gòu)造器,底層構(gòu)造一個(gè)LinkedHashMap來(lái)實(shí)現(xiàn),在相關(guān)操作上與父類(lèi)HashSet的操作相同,直接調(diào)用父類(lèi)HashSet的方法即可。LinkedHashSet的源代碼如下:
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)用父類(lèi)的構(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)用父類(lèi)的構(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)用父類(lèi)的構(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)用父類(lèi)的構(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);??????}??}??
?
???在父類(lèi)HashSet中,專(zhuān)為L(zhǎng)inkedHashSet提供的構(gòu)造方法如下,該方法為包訪(fǎng)問(wèn)權(quán)限,并未對(duì)外公開(kāi)。
/**??????*?以指定的initialCapacity和loadFactor構(gòu)造一個(gè)新的空鏈接哈希集合。??????*?此構(gòu)造函數(shù)為包訪(fǎng)問(wèn)權(quán)限,不對(duì)外公開(kāi),實(shí)際只是是對(duì)LinkedHashSet的支持。??????*??????*?實(shí)際底層會(huì)以指定的參數(shù)構(gòu)造一個(gè)空LinkedHashMap實(shí)例來(lái)實(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);??????}??
?
????由上述源代碼可見(jiàn),LinkedHashSet通過(guò)繼承HashSet,底層使用LinkedHashMap,以很簡(jiǎn)單明了的方式來(lái)實(shí)現(xiàn)了其自身的所有功能。
?
3.? 相關(guān)說(shuō)明:
?? 1) 相關(guān)HashSet的實(shí)現(xiàn)原理,請(qǐng)參考我的上一遍總結(jié):深入Java集合學(xué)習(xí)系列:HashSet的實(shí)現(xiàn)原理。
?? 2)相關(guān)HashMap的實(shí)現(xiàn)原理,請(qǐng)參考我的上一遍總結(jié):深入Java集合學(xué)習(xí)系列:HashMap的實(shí)現(xiàn)原理。
?
?
總結(jié)
以上是生活随笔為你收集整理的深入Java集合学习系列:LinkedHashSet的实现原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。