3分鐘搞掂Set集合

前言

聲明,本文用的是jdk1.8數組

前面章節回顧:微信

如今這篇主要講Set集合的三個子類:數據結構

  • HashSet集合
    • A:底層數據結構是哈希表(是一個元素爲鏈表的數組) + 紅黑樹
  • TreeSet集合
    • A:底層數據結構是紅黑樹(是一個自平衡的二叉樹)
    • B:保證元素的排序方式
  • LinkedHashSet集合
    • A::底層數據結構由哈希表(是一個元素爲鏈表的數組)和雙向鏈表組成。

這篇主要來看看它們比較重要的方法是如何實現的,須要注意些什麼,最後比較一下哪一個時候用哪一個~多線程

強調:在學習本文以前,最好是看過Map系列的文章post

看這篇文章以前最好是有點數據結構的基礎:性能

固然了,若是講得有錯的地方還請你們多多包涵並不吝在評論去指正~學習

1、HashSet剖析

首先,咱們來看一下HashSet的繼承結構圖:spa

 

 

按照慣例,咱們來看看HashSet頂部註釋:.net

 

 

從頂部註釋來看,咱們就能夠概括HashSet的要點了:線程

  • 實現Set接口
  • 不保證迭代順序
  • 容許元素爲null
  • 底層其實是一個HashMap實例
  • 非同步
  • 初始容量很是影響迭代性能

我原本也是想在寫完List集合就轉到Set集合的了,但是:看到底層其實是一個HashMap實例時,我就去學習Map集合先了~

頂部註釋說底層其實是一個HashMap實例,那證據呢?

 

 

咱們再來看一下HashSet整個類的方法和屬性:

 

 

對於學習過HashMap的人來講,簡直簡單得讓人開心,哈哈哈~

咱們知道Map是一個映射,有key有value,既然HashSet底層用的是HashMap,那麼value在哪裏呢???

 

 

value是一個Object,全部的value都是它

因此能夠直接總結出:HashSet實際上就是封裝了HashMap,操做HashSet元素實際上就是操做HashMap。這也是面向對象的一種體現,重用性賊高

建議:先去閱讀HashMap就是這麼簡單【源碼剖析】

2、TreeSet剖析

首先,咱們也來看看TreeSet的類繼承結構圖:

 

 

按照慣例,咱們來看看TreeSet頂部註釋:

 

 

從頂部註釋來看,咱們就能夠概括TreeSet的要點了:

  • 實現NavigableSet接口
  • 能夠實現排序功能
  • 底層其實是一個TreeMap實例
  • 非同步

 

 

3、LinkedHashSet剖析

首先,咱們也來看看TreeSet的類繼承結構圖:

 

 

按照慣例,咱們來看看LinkedHashSet頂部註釋:

 

 

從頂部註釋來看,咱們就能夠概括LinkedHashSet的要點了:

  • 迭代是有序的
  • 容許爲null
  • 底層其實是一個HashMap+雙向鏈表實例(其實就是LinkedHashMap)...
  • 非同步
  • 性能比HashSet差一丟丟,由於要維護一個雙向鏈表
  • 初始容量與迭代無關,LinkedHashSet迭代的是雙向鏈表

4、總結

能夠很明顯地看到,Set集合的底層就是Map,因此我都沒有作太多的分析在上面,也沒什麼好分析的了。

下面總結一下Set集合經常使用的三個子類吧:

HashSet:

  • 無序,容許爲null,底層是HashMap(散列表+紅黑樹),非線程同步

TreeSet:

  • 有序,不容許爲null,底層是TreeMap(紅黑樹),非線程同步

LinkedHashSet:

  • 迭代有序,容許爲null,底層是HashMap+雙向鏈表,非線程同步

從結論而言咱們就能夠根據本身的實際狀況來使用了。

參考資料:

若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:Java3y

 

爲了你們方便,剛新建了一下q羣:742919422,你們也能夠去交流交流。

文章的目錄導航zhongfucheng.bitcron.com/post/shou-j…

目前初步打算寫多線程,大家以爲怎麼樣呢?能夠在評論區留言~

相關文章
相關標籤/搜索