摘要:下面總結(jié)一下集合常用的三個子類吧無序,允許為,底層是散列表紅黑樹,非線程同步有序,不允許為,底層是紅黑樹非線程同步迭代有序,允許為,底層是雙向鏈表,非線程同步從結(jié)論而言我們就可以根據(jù)自己的實(shí)際情況來使用了。
前言
聲明,本文用的是jdk1.8
前面章節(jié)回顧:
Collection總覽
List集合就這么簡單【源碼剖析】
Map集合、散列表、紅黑樹介紹
HashMap就是這么簡單【源碼剖析】
LinkedHashMap就這么簡單【源碼剖析】
TreeMap就這么簡單【源碼剖析】
ConcurrentHashMap基于JDK1.8源碼剖析
現(xiàn)在這篇主要講Set集合的三個子類:
HashSet集合
A:底層數(shù)據(jù)結(jié)構(gòu)是哈希表(是一個元素為鏈表的數(shù)組) + 紅黑樹
TreeSet集合
A:底層數(shù)據(jù)結(jié)構(gòu)是紅黑樹(是一個自平衡的二叉樹)
B:保證元素的排序方式
LinkedHashSet集合
A::底層數(shù)據(jù)結(jié)構(gòu)由哈希表(是一個元素為鏈表的數(shù)組)和雙向鏈表組成。
這篇主要來看看它們比較重要的方法是如何實(shí)現(xiàn)的,需要注意些什么,最后比較一下哪個時候用哪個~
強(qiáng)調(diào):在學(xué)習(xí)本文之前,最好是看過Map系列的文章
看這篇文章之前最好是有點(diǎn)數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ):
Java實(shí)現(xiàn)單向鏈表
棧和隊(duì)列就是這么簡單
二叉樹就這么簡單
當(dāng)然了,如果講得有錯的地方還請大家多多包涵并不吝在評論去指正~
一、HashSet剖析首先,我們來看一下HashSet的繼承結(jié)構(gòu)圖:
按照慣例,我們來看看HashSet頂部注釋:
從頂部注釋來看,我們就可以歸納HashSet的要點(diǎn)了:
實(shí)現(xiàn)Set接口
不保證迭代順序
允許元素為null
底層實(shí)際上是一個HashMap實(shí)例
非同步
初始容量非常影響迭代性能
我本來也是想在寫完List集合就轉(zhuǎn)到Set集合的了,可是:看到底層實(shí)際上是一個HashMap實(shí)例時,我就去學(xué)習(xí)Map集合先了~
頂部注釋說底層實(shí)際上是一個HashMap實(shí)例,那證據(jù)呢?
我們再來看一下HashSet整個類的方法和屬性:
對于學(xué)習(xí)過HashMap的人來說,簡直簡單得讓人開心,哈哈哈~
我們知道Map是一個映射,有key有value,既然HashSet底層用的是HashMap,那么value在哪里呢???
value是一個Object,所有的value都是它
所以可以直接總結(jié)出:HashSet實(shí)際上就是封裝了HashMap,操作HashSet元素實(shí)際上就是操作HashMap。這也是面向?qū)ο蟮囊环N體現(xiàn),重用性賊高!
建議:先去閱讀HashMap就是這么簡單【源碼剖析】
二、TreeSet剖析首先,我們也來看看TreeSet的類繼承結(jié)構(gòu)圖:
按照慣例,我們來看看TreeSet頂部注釋:
從頂部注釋來看,我們就可以歸納TreeSet的要點(diǎn)了:
實(shí)現(xiàn)NavigableSet接口
可以實(shí)現(xiàn)排序功能
底層實(shí)際上是一個TreeMap實(shí)例
非同步
三、LinkedHashSet剖析首先,我們也來看看TreeSet的類繼承結(jié)構(gòu)圖:
按照慣例,我們來看看LinkedHashSet頂部注釋:
從頂部注釋來看,我們就可以歸納LinkedHashSet的要點(diǎn)了:
迭代是有序的
允許為null
底層實(shí)際上是一個HashMap+雙向鏈表實(shí)例(其實(shí)就是LinkedHashMap)...
非同步
性能比HashSet差一丟丟,因?yàn)橐S護(hù)一個雙向鏈表
初始容量與迭代無關(guān),LinkedHashSet迭代的是雙向鏈表
四、總結(jié)可以很明顯地看到,Set集合的底層就是Map,所以我都沒有做太多的分析在上面,也沒什么好分析的了。
下面總結(jié)一下Set集合常用的三個子類吧:
HashSet:
無序,允許為null,底層是HashMap(散列表+紅黑樹),非線程同步
TreeSet:
有序,不允許為null,底層是TreeMap(紅黑樹),非線程同步
LinkedHashSet:
迭代有序,允許為null,底層是HashMap+雙向鏈表,非線程同步
從結(jié)論而言我們就可以根據(jù)自己的實(shí)際情況來使用了。
參考資料:
https://zhuanlan.zhihu.com/p/29021276
https://blog.csdn.net/panweiwei1994/article/details/76555359
如果文章有錯的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號:Java3y。為了大家方便,剛新建了一下qq群:742919422,大家也可以去交流交流。謝謝支持了!希望能多介紹給其他有需要的朋友
文章的目錄導(dǎo)航:https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang
目前初步打算寫多線程,你們覺得怎么樣呢?可以在評論區(qū)留言~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69071.html
摘要:此項(xiàng)禁止的一個特殊情況是不允許某個包含其自身作為元素。即使的順序與不一致,其行為也是定義良好的它只是違背了接口的常規(guī)協(xié)定。 原問題 Java 中怎樣實(shí)現(xiàn)一種即使元素改變依然有序的集合? 問題由來 起因是在公司做游戲項(xiàng)目的時候遇到一個需求需要實(shí)現(xiàn): 服務(wù)器要維護(hù)一個幫派成員(Member)的集合,這個集合要按照在線狀態(tài)、成員等級和名稱依次有序排列。 由于每時每刻都有玩家在不斷上下線,成員...
摘要:它通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因?yàn)橹悼梢允亲址A斜砑虾陀行蚣系阮愋汀1硎緝?nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何。管理方便,后續(xù)可自行增加或摘除節(jié)點(diǎn),移動分槽等等。 本文已獲得原作者霸都民工哥授權(quán)。 1、Redis 簡介 REmote DIctionary Server(Redis) ?是一個由 Salvatore Sanfilippo寫的 key-value 存儲...
閱讀 3623·2021-11-24 09:39
閱讀 2557·2021-11-15 11:37
閱讀 2216·2021-11-11 16:55
閱讀 5206·2021-10-14 09:43
閱讀 3711·2021-10-08 10:05
閱讀 3012·2021-09-13 10:26
閱讀 2333·2021-09-08 09:35
閱讀 3541·2019-08-30 15:55