Java集合中的Set之LinkedHashSet詳解
Set中的LinkedHashSet
LinkedHashSet是Set集合的一個實現,具有set集合不重復的特點,同時具有可預測的迭代順序,也就是我們插入的順序。
并且linkedHashSet是一個非線程安全的集合。
如果有多個線程同時訪問當前l(fā)inkedhashset集合容器,并且有一個線程對當前容器中的元素做了修改,那么必須要在外部實現同步保證數據的冥等性。
下面我們new一個新的LinkedHashSet容器看一下具體的源碼實現。
并分析師如何保證數據的插入順序:
Set<String> set = new LinkedHashSet<>();
跟進LinkedHashSet可以得到super一個父類初始化為一個容器為16大小,加載因子為0.75的Map容器。
構造一個空連接散列集合


實際創(chuàng)建的是一個LinkedHashMap帶有制定大小和加載因子的容器。
在前面講過一次,map的容器的大小必須是2的冥,那么在講一次如何保證必須是2的冥,通過我們傳入的參數在構建map集合的是通過位運算實現:

其中initialCapacity為我們傳入的具體按容器的大小。
上面是我們描述的LinkedHashSet的具體構建過程,以及構建的具體內容。
由于LinkedHashSet是一個哈希表和鏈表的結合,且是一個雙向鏈表,那么我們來看一下什么是雙向連邊?
雙向鏈表是鏈表的一種,他的每個數據節(jié)點都有兩個指針分別指向直接后繼和直接前驅,所以從雙向鏈表的任意一個節(jié)點開始都可以很方便的訪問它的前驅節(jié)點和后繼節(jié)點。
這是雙向鏈表的優(yōu)點,那么有優(yōu)點就有缺點,缺點是每個節(jié)點都需要保存當前節(jié)點的next和prev兩個屬性,這樣才能保證優(yōu)點。
所以需要更多的內存開銷,并且刪除和添加也會比較費時間。
下面我們圖示一個雙向兩表的節(jié)點:

多個節(jié)點相互連接,保證了數據錄入的順序。
源碼分析
那么我們源碼分析一下具體的錄入詳情:
我們定義一個LinkedHashSet
LinkedHashSet<String> set = new LinkedHashSet<>();
然后set.add();跟一下這個add是走的那個方法:

跟進來走的是put的方法:LinkedHashSet.class下的,這個是重寫了超類中put的具體add方法。
他會在新分配的元素在鏈表的末尾插入一條。


進來走的還是HashMap的put添加方法,在上面的判斷和計算hash確定位置之后,由于LinkedHashSet重寫了addEntry

在元素的后面添加新的元素。
整個過程就是LinkedHashSet在容器插入數據的過程。
此過程主要由LinkedHashSet.class中重寫超類的兩個addEntry和createEntry 實現雙向鏈表的結構。
保證數據已我們錄入的順序遍歷輸出。
到此這篇關于Java集合中的Set之LinkedHashSet詳解的文章就介紹到這了,更多相關Java中的LinkedHashSet內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MyBatis Plus like參數為百分號%查詢結果異常原因分析及解決
文章指出在MyBatisPlus使用LIKE查詢時,用戶輸入的%可能導致通配符誤匹配,推薦使用ESCAPE轉義功能,將%轉換為普通字符,既支持模糊查詢又避免全表匹配,提升準確性和性能2025-09-09
Java?GenericObjectPool?對象池化技術之SpringBoot?sftp?連接池工具類詳解
這篇文章主要介紹了Java?GenericObjectPool?對象池化技術之SpringBoot?sftp?連接池工具類詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04

