1. 程式人生 > >HashSet原始碼分析:JDK原始碼系列

HashSet原始碼分析:JDK原始碼系列

1.簡介

繼續分析原始碼,上一篇文章把HashMap的分析完畢。本文開始分析HashSet簡單的介紹一下。

HashSet是一個無重複元素集合,內部使用HashMap實現,所以HashMap的特徵耶繼承了下來。儲存的元素是無序的並且HashSet允許使用空的元素。

HashSet是非同步的。如果多個執行緒同時訪問一個雜湊 set,而其中至少一個執行緒修改了該 set,那麼它必須 保持外部同步。(參考JDK1.8文件,關注回覆JDK可獲取中文版JDK文件)

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

上文連結:

HashMap原始碼閱讀(一)

HashMap原始碼閱讀(二)

1.繼承結構

先看一下HashMap的繼承結構

和其他集合一樣HashSet也實現了Cloneable和Serializable兩個介面,同時也是先了Set介面實現了Set的一些介面規範。

  • Cloneable 克隆
  • Serializable序列化

2屬性

HashSet的儲存資料是由HashMap來實現的,所以HashMap的一些特性也都繼承了過來。在閱讀原始碼的時候千萬不要直接的去閱讀HashSet在閱讀之前最好先把HashMap看了。在閱讀HashMap的時候最好結合著1.7版本的原始碼一起看。

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();

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的原始碼已經閱讀過的話基本上沒有什麼問題。(這可能是我寫的最輕鬆的一篇問文章哈哈哈哈哈