HashSet原來這麼簡單

HashSet學習記錄

0、簡介

​ 本篇主要記錄下HashSet的源碼學習記錄,是隨機看到的,隨手記錄下。大家都知道HashMap是一種存儲鍵值對的數據結構,HashSet從名字可以看出來其主要是一個集合,通過數學上集合的概念可以知道集合存放非是沒有重複數據的集。HashSet底層實現是通過組合了一個HashMap實現的,通過藉助HashMap中key不能重複的特性實現HashSet想要的功能。

​ 本篇學習記錄主要記錄以下幾個點:

​ 1、HashSet的使用示例

​ 2、HashSet的構造方法及屬性

​ 3、根據示例看其方法源碼

1、HashSet的使用示例

​ HashSet是一個沒有重複元素的集合,演示代碼如下:

public class HashSetTest {

    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("fuhang");
        set.add("zhangsan");
        set.add("lisi");
        set.add("fuhang");
        System.out.println(set.size());
        set.contains("fuhang");
        set.remove("fuhang");

    }
}
2、HashSet的構造函數及屬性

繼承關係圖

在這裏插入圖片描述

屬性

// 內部組合一個HashMap
private transient HashMap<E,Object> map;

// 這個爲了填充HashMap的value創建的統一對象
private static final Object PRESENT = new Object();

構造函數

 // 無參構造函數,內部創建了一個HashMap(),調用了HashMap的無參構造函數
 public HashSet() {
        map = new HashMap<>();
 }

// 參數爲另一個集合的構造函數
public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
 }

 // 參數爲初始容量及負載因子的構造函數
 public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
 }

 // 參數爲初始容量的構造函數
 public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
 }

 // 同包下其他類可調用的構造函數,底層創建了一個LinkedHashMap
 HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

3、根據示例看其方法源碼

​ 下面逐個方法開始分析。HashMap源碼可以看我另一篇詳細的分析文章。

​ ① add(E e)

​ add方法內部調用了HashMap.put()(一般是HashMap)方法,使用e作爲key,固定對象PRESENT作爲value

// 內部調用HashMap的put方法
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
}

​ ② remove(Object o)

​ 底層調用HashMap的remove方法

public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
}

​ ③ contains(Object o)

​ 底層還是調用HashMap的方法

public boolean contains(Object o) {
        return map.containsKey(o);
}

總結

​ 以上就是很簡單的HashSet"內部",希望以後用到時候無疑惑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章