HashSet 實現了 Set 接口,是一個不包含重複元素的集合。經過源代碼分析一下 HashSet 是如何作到元素不重複的。java
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
繼承自 AbstractSet 抽象類,實現了 Set 接口spa
private transient HashMap<E,Object> map; private static final Object PRESENT = new Object();
定義了一個全局的 HashMap<E, Object> 還有一個 PRESET 的全局的靜態變量,初始化爲一個空的 Object。code
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); }
一共提供了4個構造方法,提供了一些不一樣的參數,主要是 new 出一個新的 HashMap,設置不一樣的容量和負載因子,因而可知 HashSet 的內部是經過 HashMap 實現的。對象
public boolean add(E e) { return map.put(e, PRESENT)==null; }
add 方法實際上是調用的 map 的 put 方法,將對象做爲 key,PRESET 常量做爲 value,放入全局的 map。經過 HashMap 不能含有重複 key 的特性來完成 "HashSet 不能包含重複值的" 的功能。繼承
public boolean contains(Object o) { return map.containsKey(o); } public boolean remove(Object o) { return map.remove(o)==PRESENT; }
都是直接調用的 HashMap 的方法。接口
HashSet 的源碼仍是比較簡單的。基本稍微看一下源代碼都能看懂。ci