Java集合中的LinkedHashSet源碼解讀
一、介紹
前面文章中我們從源碼詳細(xì)介紹了繼承于HashMap的LinkedHashMap,并通過圖片示例講解了LinkedHashMap是如何在HashMap的哈希表上將各個(gè)節(jié)點(diǎn)通過雙向鏈表串起來的。
也講解了基于HashMap實(shí)現(xiàn)的HashSet,那么是否存在類似于LinkedHashMap原理的一種Set集合?答案是肯定的,而且是我們本篇文章要講的LinkedHashSet
顧名思義,LinkedHashSet是基于LinkedHashMap實(shí)現(xiàn)的一個(gè)Set集合。
另外,本片文章雖然不長,但是對(duì)前置知識(shí)點(diǎn)有著很強(qiáng)的依賴,需要掌握的前置知識(shí)有:HashMap(必選)、紅黑樹(可選)、LinkedHashMap(必選)、HashSet(必選)
二、類的聲明
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable
從類的聲明中可以看到
- 繼承HashSet,表示LinkedHashSet是對(duì)HashSet的擴(kuò)展。
- 實(shí)現(xiàn)set接口,滿足Set集合的定義
- 實(shí)現(xiàn)了Cloneable接口,提供了對(duì)象克隆方法,但請(qǐng)注意,是淺克隆。
- 實(shí)現(xiàn)了Serializable接口,支持序列化。
三、構(gòu)造方法
前面我們?cè)谥vHashSet的構(gòu)造方法時(shí),其中有一個(gè)構(gòu)造方法我們做了特殊對(duì)待,如下所示
HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }
該構(gòu)造方法創(chuàng)建的map對(duì)象的類型是LinkedHashMap,不同于其他構(gòu)造方法創(chuàng)建的HashMap對(duì)象。
而且我們有個(gè)關(guān)鍵點(diǎn)不要忽略,在LinkedHashMap中,雙向鏈表的遍歷順序通過構(gòu)造方法指定,如果沒有指定,則使用默認(rèn)順序?yàn)椴迦腠樞?,即accessOrder=false。因此,上面的構(gòu)造方法所創(chuàng)建的LinkedHashMap對(duì)象的雙向鏈表遍歷順序?yàn)椴迦腠樞颉?/p>
且該構(gòu)造方法就是為了給其子類LinkedHashSet使用的。我們往下看
無參構(gòu)造
創(chuàng)建LinkedHashMap實(shí)例為內(nèi)部屬性,并指定底層哈希表的初始容量為16,加載因子為0.75
public LinkedHashSet() { super(16, .75f, true); }
指定初始容量
創(chuàng)建LinkedHashMap實(shí)例為內(nèi)部屬性,并指定底層哈希表的初始容量為initialCapacity,加載因子為0.75
public LinkedHashSet(int initialCapacity) { super(initialCapacity, .75f, true); }
指定初始容量和加載因子
創(chuàng)建LinkedHashMap實(shí)例為內(nèi)部屬性,并指定底層哈希表的初始容量為initialCapacity,加載因子為loadFactor
public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true); }
通過集合構(gòu)造
雖然說LinkedHashSet的底層是LinkedHashMap,但終究還是哈希表+雙向鏈表,需要對(duì)哈希表的容量進(jìn)行計(jì)算以避免頻繁的擴(kuò)容。
創(chuàng)建LinkedHashMap實(shí)例作為內(nèi)部對(duì)象后,通過addAll()方法將集合中的元素逐一保存,addAll()方法作為一個(gè)批量保存模版由其父類AbstractCollection提供,其中的add()方法由父類HashSet實(shí)現(xiàn),這是設(shè)計(jì)模式—模版方法的體現(xiàn)。
public LinkedHashSet(Collection<? extends E> c) { super(Math.max(2*c.size(), 11), .75f, true); addAll(c); } public boolean addAll(Collection<? extends E> c) { boolean modified = false; for (E e : c) if (add(e)) modified = true; return modified; }
四、最后
看了LinkedHashSet的源碼后,發(fā)現(xiàn)它只提供了以上幾個(gè)構(gòu)造函數(shù),卻沒有提供各個(gè)方法。
這是因?yàn)樗^承于HashSet,因此HashSet中提供的方法都是可以被LinkedHashSet對(duì)象調(diào)用的,如add()、remove()、contains()等方法。所以不再過多介紹,
五、結(jié)論
- LinkedHashSet內(nèi)部維護(hù)一個(gè)LinkedHashMap對(duì)象,其底層數(shù)據(jù)結(jié)構(gòu)為哈希表+鏈表+紅黑樹+雙向鏈表
- LinkedHashSet對(duì)內(nèi)部雙向鏈表的遍歷順序?yàn)椴迦腠樞?/li>
到此這篇關(guān)于Java集合中的LinkedHashSet源碼解讀的文章就介紹到這了,更多相關(guān)LinkedHashSet源碼解讀內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud Gateway打造可擴(kuò)展的微服務(wù)網(wǎng)關(guān)
微服務(wù)網(wǎng)關(guān)是一個(gè)位于客戶端和后端微服務(wù)之間的服務(wù)器,用于處理所有與客戶端的通信,Spring Cloud Gateway都是一個(gè)值得考慮的選擇,它將幫助您更好地管理和保護(hù)您的微服務(wù),感興趣的朋友一起看看吧2023-11-11Java基礎(chǔ)之動(dòng)態(tài)代理Cglib詳解
這篇文章主要介紹了Java基礎(chǔ)之動(dòng)態(tài)代理Cglib詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05SpringBoot如何通過@Profile注解配置多環(huán)境
在Spring中,可以使用配置文件的方式來指定不同環(huán)境下所需要的配置信息,本文給大家介紹SpringBoot如何通過@Profile注解配置多環(huán)境,感興趣的朋友跟隨小編一起看看吧2023-06-06Java語言實(shí)現(xiàn)簡單FTP軟件 FTP上傳下載隊(duì)列窗口實(shí)現(xiàn)(7)
這篇文章主要為大家詳細(xì)介紹了Java語言實(shí)現(xiàn)簡單FTP軟件,F(xiàn)TP上傳下載隊(duì)列窗口的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04SpringBoot實(shí)現(xiàn)圖片上傳及本地訪問
在SpringBoot項(xiàng)目中,處理靜態(tài)文件訪問尤其是實(shí)時(shí)更新的文件如商品圖片,可通過配置WebMvcConfig將本地文件映射到URL路徑上,以解決重啟項(xiàng)目才能訪問文件的問題,本文詳解如何保存和訪問這些文件,幫助開發(fā)者優(yōu)化項(xiàng)目文件管理2022-09-09