1. 程式人生 > >HashSet 原始碼分析(jdk1.8)

HashSet 原始碼分析(jdk1.8)

類繼承關係:

(*=>:介面實現)

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