HashSet 原始碼分析(jdk1.8)
阿新 • • 發佈:2018-12-16
類繼承關係:
(*=>:介面實現)
java.lang.Object –java.util.AbstractCollection =>Collection –java.util.AbstractSet =>Set –java.util.HashSet =>Set, Cloneable, java.io.Serializable
什麼是HashSet
實現了Set介面,由一個雜湊表(實際上是一個HashMap例項)支援。對集合的迭代次序沒有保證,允許null 元素但不允許有重複元素。
HashSet資料結構
HashSet是通過呼叫HashMap實現的,所儲存的值就是HashMap中的key值,所以HashSet的資料結構與HashMap的資料結構相同。(點選跳轉Java集合原始碼實現三:HashMap (jdk1.8))。
原始碼分析:
1.類繼承實現
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{
//方法....
}
可克隆,可序列化
2.成員變數
/** * 儲存元素的map HashSet實質上就是一個HashMap */ private transient HashMap<E,Object> map; /** * 定義一個虛擬值作為HashMap的value */ private static final Object PRESENT = new Object();
3.主要方法
構造方法 1. /** * 構造一個無引數的HashSet,實際上就是初始化了一個預設引數的HashMap */ public HashSet() { map = new HashMap<>(); } 以下幾個構造方法也同理分別初始化不同的HashMap,詳情請參考HashMap篇 2. /** * */ public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); } 1 3. /** * */ public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } 4. /** * */ public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } 5. /** * 給子類LinkedHashSet使用的 所以初始化的也是LinkedHashMap * @param dummy 標記作用 區分開其他構造方法 沒實際意義 */ HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }
新增元素
/**
* 呼叫HashMap的新增方法
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
新增的元素實際就是新增hashMap的key值,因為key值是不能重複的,所以HashSet中的元素不能重複
刪除元素
/**
* 呼叫HashMap的刪除方法
*/
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
--------------------- 原文:https://blog.csdn.net/qq_23830637/article/details/79022047