摘要:簡介繼續分析源碼,上一篇文章把的分析完畢。本文開始分析簡單的介紹一下。存儲的元素是無序的并且允許使用空的元素。
1.簡介
繼續分析源碼,上一篇文章把HashMap的分析完畢。本文開始分析HashSet簡單的介紹一下。
HashSet是一個無重復元素集合,內部使用HashMap實現,所以HashMap的特征耶繼承了下來。存儲的元素是無序的并且HashSet允許使用空的元素。
HashSet是非同步的。如果多個線程同時訪問一個哈希 set,而其中至少一個線程修改了該 set,那么它必須 保持外部同步。(參考JDK1.8文檔,關注回復JDK可獲取中文版JDK文檔)
Set s = Collections.synchronizedSet(new HashSet(...));
上文鏈接:1.繼承結構HashMap源碼閱讀(一)
HashMap源碼閱讀(二)
先看一下HashMap的繼承結構
和其他集合一樣HashSet也實現了Cloneable和Serializable兩個接口,同時也是先了Set接口實現了Set的一些接口規范。
Cloneable 克隆
Serializable序列化
2屬性HashSet的存儲數據是由HashMap來實現的,所以HashMap的一些特性也都繼承了過來。在閱讀源碼的時候千萬不要直接的去閱讀HashSet在閱讀之前最好先把HashMap看了。在閱讀HashMap的時候最好結合著1.7版本的源碼一起看。
private transient HashMapmap;
上面說到HashSet是由HashMap來實現的而存儲的數據作為HashMap的K,V統一就是PRESENT
// Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object();3.構造方法
無參構造方法,直接創建一個HashMap采用無參構造方法的默認屬性上篇文章說過默認容量是16加載因子是0.75
指定容量
指定容量和加載因子,加載因子在HashMap中用來計算容量默認的就是總容量*加載因子,默認的加載因子是0.75
指定集合元素
4.添加可以看出HashSet使用put進行添加元素,要添加的元素作為mapd的Key 而value則默認的就是PRESENT。上篇文章介紹過HashMap的put方法如果插入的值的Key不存在則返回null否則就返回已經存在的值,所以這里做了一個判斷。是不是很簡單。
5.查找查找元素調用了HashMap的containsKey方法如果存在返回true不存在返回false。
6.刪除刪除方法也是調用map的remove方法,看到這里我們看出HashSet全部是依賴于HashMap。
7.迭代方法也是通過Map來實現使用keySet來返回一個key的Iterator。
8.總結其實HashSet的一些東西都是用HashMap來實現的,如果HashMap的源碼已經閱讀過的話基本上沒有什么問題。(這可能是我寫的最輕松的一篇問文章哈哈哈哈哈)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75517.html
摘要:三系列用于保存鍵值對,無論是,還是已棄用的或者線程安全的等,都是基于紅黑樹。是完全基于紅黑樹的,并在此基礎上實現了接口。可以看到,只有紅黑樹,且紅黑樹是通過內部類來實現的。 JDK容器 前言 閱讀JDK源碼有段時間了,準備以博客的形式記錄下來,也方便復習時查閱,本文參考JDK1.8源碼。 一、Collection Collection是所有容器的基類,定義了一些基礎方法。List、Se...
摘要:下面總結一下集合常用的三個子類吧無序,允許為,底層是散列表紅黑樹,非線程同步有序,不允許為,底層是紅黑樹非線程同步迭代有序,允許為,底層是雙向鏈表,非線程同步從結論而言我們就可以根據自己的實際情況來使用了。 前言 聲明,本文用的是jdk1.8 前面章節回顧: Collection總覽 List集合就這么簡單【源碼剖析】 Map集合、散列表、紅黑樹介紹 HashMap就是這么簡單【源碼...
摘要:但是,如果像上例中只取最后幾位的時候,這可不是什么好事,即使我的數據分布很散亂,但是哈希沖突仍然會很嚴重。由于我們所創建的是類型的,這也是最巧的一點,類型的返回值就是其值本身,而存儲的時候元素通過一些運算后會得出自己在數組中所處的位置。 HashSet 是否無序 (一) 問題起因: 《Core Java Volume I—Fundamentals》中對HashSet的描述是這樣的: H...
摘要:若遇到哈希沖突,則將沖突的值加到鏈表中即可。之后相比于之前的版本,之后在解決哈希沖突時有了較大的變化,當鏈表長度大于閾值默認為時,將鏈表轉化為紅黑樹,以減少搜索時間。有序,唯一紅黑樹自平衡的排序二叉樹。 本文是最最最常見Java面試題總結系列第三周的文章。主要內容: Arraylist 與 LinkedList 異同 ArrayList 與 Vector 區別 HashMap的底層...
摘要:發生了線程不安全情況。本來在中,發生哈希沖突是可以用鏈表法或者紅黑樹來解決的,但是在多線程中,可能就直接給覆蓋了。中,當同一個值上元素的鏈表節點數不小于時,將不再以單鏈表的形式存儲了,會被調整成一顆紅黑樹。 showImg(https://segmentfault.com/img/bVbsVLk?w=288&h=226); List 和 Set 的區別 List , Set 都是繼承自...
閱讀 742·2021-07-25 21:37
閱讀 3654·2019-08-30 15:55
閱讀 2572·2019-08-30 15:54
閱讀 1717·2019-08-30 15:44
閱讀 3123·2019-08-30 15:44
閱讀 859·2019-08-30 15:43
閱讀 1021·2019-08-29 15:36
閱讀 3038·2019-08-29 10:58