摘要:簡介繼續(xù)分析源碼,上一篇文章把的分析完畢。本文開始分析簡單的介紹一下。存儲的元素是無序的并且允許使用空的元素。
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(...));
上文鏈接:1.繼承結(jié)構(gòu)HashMap源碼閱讀(一)
HashMap源碼閱讀(二)
先看一下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 HashMapmap;
上面說到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)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75517.html
摘要:三系列用于保存鍵值對,無論是,還是已棄用的或者線程安全的等,都是基于紅黑樹。是完全基于紅黑樹的,并在此基礎(chǔ)上實現(xiàn)了接口??梢钥吹剑挥屑t黑樹,且紅黑樹是通過內(nèi)部類來實現(xiàn)的。 JDK容器 前言 閱讀JDK源碼有段時間了,準(zhǔn)備以博客的形式記錄下來,也方便復(fù)習(xí)時查閱,本文參考JDK1.8源碼。 一、Collection Collection是所有容器的基類,定義了一些基礎(chǔ)方法。List、Se...
摘要:下面總結(jié)一下集合常用的三個子類吧無序,允許為,底層是散列表紅黑樹,非線程同步有序,不允許為,底層是紅黑樹非線程同步迭代有序,允許為,底層是雙向鏈表,非線程同步從結(jié)論而言我們就可以根據(jù)自己的實際情況來使用了。 前言 聲明,本文用的是jdk1.8 前面章節(jié)回顧: Collection總覽 List集合就這么簡單【源碼剖析】 Map集合、散列表、紅黑樹介紹 HashMap就是這么簡單【源碼...
摘要:但是,如果像上例中只取最后幾位的時候,這可不是什么好事,即使我的數(shù)據(jù)分布很散亂,但是哈希沖突仍然會很嚴(yán)重。由于我們所創(chuàng)建的是類型的,這也是最巧的一點,類型的返回值就是其值本身,而存儲的時候元素通過一些運算后會得出自己在數(shù)組中所處的位置。 HashSet 是否無序 (一) 問題起因: 《Core Java Volume I—Fundamentals》中對HashSet的描述是這樣的: H...
摘要:若遇到哈希沖突,則將沖突的值加到鏈表中即可。之后相比于之前的版本,之后在解決哈希沖突時有了較大的變化,當(dāng)鏈表長度大于閾值默認(rèn)為時,將鏈表轉(zhuǎn)化為紅黑樹,以減少搜索時間。有序,唯一紅黑樹自平衡的排序二叉樹。 本文是最最最常見Java面試題總結(jié)系列第三周的文章。主要內(nèi)容: Arraylist 與 LinkedList 異同 ArrayList 與 Vector 區(qū)別 HashMap的底層...
摘要:發(fā)生了線程不安全情況。本來在中,發(fā)生哈希沖突是可以用鏈表法或者紅黑樹來解決的,但是在多線程中,可能就直接給覆蓋了。中,當(dāng)同一個值上元素的鏈表節(jié)點數(shù)不小于時,將不再以單鏈表的形式存儲了,會被調(diào)整成一顆紅黑樹。 showImg(https://segmentfault.com/img/bVbsVLk?w=288&h=226); List 和 Set 的區(qū)別 List , Set 都是繼承自...
閱讀 774·2021-07-25 21:37
閱讀 3685·2019-08-30 15:55
閱讀 2604·2019-08-30 15:54
閱讀 1772·2019-08-30 15:44
閱讀 3153·2019-08-30 15:44
閱讀 887·2019-08-30 15:43
閱讀 1072·2019-08-29 15:36
閱讀 3074·2019-08-29 10:58