白玉 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