繼續分析源碼,上一篇文章把HashMap的分析完畢。本文開始分析HashSet簡單的介紹一下。java
HashSet是一個無重複元素集合,內部使用HashMap實現,因此HashMap的特徵耶繼承了下來。存儲的元素是無序的而且HashSet容許使用空的元素。spa
HashSet是非同步的。若是多個線程同時訪問一個哈希 set,而其中至少一個線程修改了該 set,那麼它必須 保持外部同步。(參考JDK1.8文檔,關注回覆JDK可獲取中文版JDK文檔)線程
Set s = Collections.synchronizedSet(new HashSet(...));
上文連接:HashMap源碼閱讀(一)code
先看一下HashMap的繼承結構接口
和其餘集合同樣HashSet也實現了Cloneable和Serializable兩個接口,同時也是先了Set接口實現了Set的一些接口規範。ci
HashSet的存儲數據是由HashMap來實現的,因此HashMap的一些特性也都繼承了過來。在閱讀源碼的時候千萬不要直接的去閱讀HashSet在閱讀以前最好先把HashMap看了。在閱讀HashMap的時候最好結合着1.7版本的源碼一塊兒看。rem
private transient HashMap<E,Object> map;
上面說到HashSet是由HashMap來實現的而存儲的數據做爲HashMap的K,V統一就是PRESENT文檔
// Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object();
無參構造方法,直接建立一個HashMap採用無參構造方法的默認屬性上篇文章說過默認容量是16加載因子是0.75get
指定容量
指定容量和加載因子,加載因子在HashMap中用來計算容量默認的就是總容量*加載因子,默認的加載因子是0.75
指定集合元素
能夠看出HashSet使用put進行添加元素,要添加的元素做爲mapd的Key 而value則默認的就是PRESENT。上篇文章介紹過HashMap的put方法若是插入的值的Key不存在則返回null不然就返回已經存在的值,因此這裏作了一個判斷。是否是很簡單。
查找元素調用了HashMap的containsKey方法若是存在返回true不存在返回false。
刪除方法也是調用map的remove方法,看到這裏咱們看出HashSet所有是依賴於HashMap。
也是經過Map來實現使用keySet來返回一個key的Iterator。
其實HashSet的一些東西都是用HashMap來實現的,若是HashMap的源碼已經閱讀過的話基本上沒有什麼問題。(這多是我寫的最輕鬆的一篇問文章哈哈哈哈哈)