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的繼承結(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)閱讀過的話基本上沒有什么問題。(這可能是我寫的最輕松的一篇問文章哈哈哈哈哈)