java linkedhashset_java之LinkedHashSet
LinkedHashSet是Set集合的一個(gè)實(shí)現(xiàn),具有set集合不重復(fù)的特點(diǎn),同時(shí)具有可預(yù)測(cè)的迭代順序,也就是我們插入的順序。
并且linkedHashSet是一個(gè)非線(xiàn)程安全的集合。如果有多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)當(dāng)前l(fā)inkedhashset集合容器,并且有一個(gè)線(xiàn)程對(duì)當(dāng)前容器中的元素做了修改,那么必須要在外部實(shí)現(xiàn)同步保證數(shù)據(jù)的冥等性。
下面我們new一個(gè)新的LinkedHashSet容器看一下具體的源碼實(shí)現(xiàn)。并分析師如何保證數(shù)據(jù)的插入順序:
Set set = new LinkedHashSet<>();
跟進(jìn)LinkedHashSet可以得到super一個(gè)父類(lèi)初始化為一個(gè)容器為16大小,加載因子為0.75的Map容器。
構(gòu)造一個(gè)空連接散列集合
實(shí)際創(chuàng)建的是一個(gè)LinkedHashMap帶有制定大小和加載因子的容器。
在前面講過(guò)一次,map的容器的大小必須是2的冥,那么在講一次如何保證必須是2的冥,通過(guò)我們傳入的參數(shù)在構(gòu)建map集合的是通過(guò)位運(yùn)算實(shí)現(xiàn):
其中initialCapacity為我們傳入的具體按容器的大小。
上面是我們描述的LinkedHashSet的具體構(gòu)建過(guò)程,以及構(gòu)建的具體內(nèi)容。
由于LinkedHashSet是一個(gè)哈希表和鏈表的結(jié)合,且是一個(gè)雙向鏈表,那么我們來(lái)看一下什么是雙向連邊?
雙向鏈表是鏈表的一種,他的每個(gè)數(shù)據(jù)節(jié)點(diǎn)都有兩個(gè)指針?lè)謩e指向直接后繼和直接前驅(qū),所以從雙向鏈表的任意一個(gè)節(jié)點(diǎn)開(kāi)始都可以很方便的訪(fǎng)問(wèn)它的前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)。這是雙向鏈表的優(yōu)點(diǎn),那么有優(yōu)點(diǎn)就有缺點(diǎn),缺點(diǎn)是每個(gè)節(jié)點(diǎn)都需要保存當(dāng)前節(jié)點(diǎn)的next和prev兩個(gè)屬性,這樣才能保證優(yōu)點(diǎn)。所以需要更多的內(nèi)存開(kāi)銷(xiāo),并且刪除和添加也會(huì)比較費(fèi)時(shí)間。
下面我們圖示一個(gè)雙向兩表的節(jié)點(diǎn):
多個(gè)節(jié)點(diǎn)相互連接,保證了數(shù)據(jù)錄入的順序。
那么我們?cè)创a分析一下具體的錄入詳情:
我們定義一個(gè)LinkedHashSet---LinkedHashSet set = new LinkedHashSet<>();
然后set.add();跟一下這個(gè)add是走的那個(gè)方法:
跟進(jìn)來(lái)走的是put的方法:LinkedHashSet.class下的,這個(gè)是重寫(xiě)了超類(lèi)中put的具體add方法。他會(huì)在新分配的元素在鏈表的末尾插入一條。
進(jìn)來(lái)走的還是HashMap的put添加方法,在上面的判斷和計(jì)算hash確定位置之后,由于LinkedHashSet重寫(xiě)了addEntry
在元素的后面添加新的元素。
整個(gè)過(guò)程就是LinkedHashSet在容器插入數(shù)據(jù)的過(guò)程。此過(guò)程主要由LinkedHashSet.class中重寫(xiě)超類(lèi)的兩個(gè)addEntry和createEntry 實(shí)現(xiàn)雙向鏈表的結(jié)構(gòu)。保證數(shù)據(jù)已我們錄入的順序遍歷輸出。
————————————————
版權(quán)聲明:本文為CSDN博主「X-TIE」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhaojie181711/article/details/80510129
總結(jié)
以上是生活随笔為你收集整理的java linkedhashset_java之LinkedHashSet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 地下城与勇士织炎在哪里得
- 下一篇: java获取byte 长度_java获取