Java集合HashSet源碼剖析

Java集合HashSet源碼剖析

白玉 IT哈哈 java

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable

HashSet實現Set接口,內部維護一個HashMap實例變量。不保證順序,容許null元素。

對於基本的操做,如add,remove,contains,size,只須要常量的時間複雜度。
安全

不是線程安全的,若是在多線程環境下,須要被同步化,如調用方法Collections.synchronizedSet(new HashSet())。多線程

HashSet的迭代器是快速失敗的,若是一個HashSet在迭代器被建立後被改變(不是使用迭代器的remove方法),迭代器會拋出ConcurrentModificationException。ide

private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

兩個實例變量,map是內部維護的HashMap,PRESENT是放到HashMap的value的變量。線程

5個構造器:code

//空set, map對象的初始容量16,負載因子0.75
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);
}
//初始化容量,使用默認負載因子0.75
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}
//使用LinkedHashMap,dummy參數的做用只是與使用HashMap實現的構造器有不同的
//方法簽名
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

//使用的是HashMap的鍵集合,返回的迭代器是鍵集合的迭代器
public Iterator<E> iterator() {
    return map.keySet().iterator();
}
//放進map的鍵值對是,參數e和常量PRESENT,全部鍵值對的值都是同一個Object對象
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

若是元素e已經存在HashSet之中,不改變Set並返回false,若是e不在HashSet之中,返回true對象

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

若是o在HashSet中,返回值是true,不然爲false接口

還有一些其餘方法沒列出來,如size,isEmpty。ci

HashSet有實現Clonable接口,因此有clone方法,實現Serializable接口,因此有writeObject,readObject序列化反序列化方法。rem

相關文章
相關標籤/搜索