HashSet源碼分析:JDK源碼系列

1.簡介

繼續(xù)分析源碼,上一篇文章把HashMap的分析完畢喊式。本文開始分析HashSet簡單的介紹一下邮利。

HashSet是一個無重復(fù)元素集合,內(nèi)部使用HashMap實現(xiàn)垃帅,所以HashMap的特征耶繼承了下來延届。存儲的元素是無序的并且HashSet允許使用空的元素。

HashSet是非同步的贸诚。如果多個線程同時訪問一個哈希 set方庭,而其中至少一個線程修改了該 set,那么它必須 保持外部同步酱固。(參考JDK1.8文檔,關(guān)注回復(fù)JDK可獲取中文版JDK文檔)

 Set s = Collections.synchronizedSet(new HashSet(...)); 

上文鏈接:

HashMap源碼閱讀(一)

HashMap源碼閱讀(二)

1.繼承結(jié)構(gòu)

先看一下HashMap的繼承結(jié)構(gòu)

和其他集合一樣HashSet也實現(xiàn)了Cloneable和Serializable兩個接口械念,同時也是先了Set接口實現(xiàn)了Set的一些接口規(guī)范。

  • Cloneable 克隆
  • Serializable序列化

2屬性

HashSet的存儲數(shù)據(jù)是由HashMap來實現(xiàn)的运悲,所以HashMap的一些特性也都繼承了過來龄减。在閱讀源碼的時候千萬不要直接的去閱讀HashSet在閱讀之前最好先把HashMap看了。在閱讀HashMap的時候最好結(jié)合著1.7版本的源碼一起看班眯。

private transient HashMap<E,Object> map;

上面說到HashSet是由HashMap來實現(xiàn)的而存儲的數(shù)據(jù)作為HashMap的K,V統(tǒng)一就是PRESENT

   // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

3.構(gòu)造方法

無參構(gòu)造方法希停,直接創(chuàng)建一個HashMap采用無參構(gòu)造方法的默認(rèn)屬性上篇文章說過默認(rèn)容量是16加載因子是0.75

指定容量

指定容量和加載因子,加載因子在HashMap中用來計算容量默認(rèn)的就是總?cè)萘?加載因子署隘,默認(rèn)的加載因子是0.75

指定集合元素

4.添加

可以看出HashSet使用put進(jìn)行添加元素,要添加的元素作為mapd的Key 而value則默認(rèn)的就是PRESENT磁餐。上篇文章介紹過HashMap的put方法如果插入的值的Key不存在則返回null否則就返回已經(jīng)存在的值违崇,所以這里做了一個判斷。是不是很簡單。

5.查找

查找元素調(diào)用了HashMap的containsKey方法如果存在返回true不存在返回false羞延。

6.刪除

刪除方法也是調(diào)用map的remove方法渣淳,看到這里我們看出HashSet全部是依賴于HashMap。

7.迭代方法

也是通過Map來實現(xiàn)使用keySet來返回一個key的Iterator伴箩。

8.總結(jié)

其實HashSet的一些東西都是用HashMap來實現(xiàn)的水由,如果HashMap的源碼已經(jīng)閱讀過的話基本上沒有什么問題。(這可能是我寫的最輕松的一篇問文章哈哈哈哈哈)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赛蔫,一起剝皮案震驚了整個濱河市砂客,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呵恢,老刑警劉巖鞠值,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渗钉,居然都是意外死亡彤恶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門鳄橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來声离,“玉大人,你說我怎么就攤上這事瘫怜〗鼋校” “怎么了饵溅?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵式廷,是天一觀的道長休偶。 經(jīng)常有香客問我,道長暗挑,這世上最難降的妖魔是什么笋除? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮炸裆,結(jié)果婚禮上垃它,老公的妹妹穿的比我還像新娘。我一直安慰自己烹看,他們只是感情好国拇,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著听系,像睡著了一般贝奇。 火紅的嫁衣襯著肌膚如雪虹菲。 梳的紋絲不亂的頭發(fā)上靠胜,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音,去河邊找鬼浪漠。 笑死陕习,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的址愿。 我是一名探鬼主播该镣,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼响谓!你這毒婦竟也來了损合?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤娘纷,失蹤者是張志新(化名)和其女友劉穎嫁审,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赖晶,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡律适,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了遏插。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捂贿。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胳嘲,靈堂內(nèi)的尸體忽然破棺而出厂僧,到底是詐尸還是另有隱情,我是刑警寧澤了牛,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布吁系,位于F島的核電站,受9級特大地震影響白魂,放射性物質(zhì)發(fā)生泄漏汽纤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一福荸、第九天 我趴在偏房一處隱蔽的房頂上張望蕴坪。 院中可真熱鬧,春花似錦敬锐、人聲如沸背传。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽径玖。三九已至,卻和暖如春颤介,著一層夾襖步出監(jiān)牢的瞬間梳星,已是汗流浹背赞赖。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冤灾,地道東北人前域。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像韵吨,于是被迫代替她去往敵國和親匿垄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容