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"內部",希望以後用到時候無疑惑。