1、首先看它的類結構
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
從類結構來看,它是比較簡單的,主要還是實現了Set的相關接口,其他的沒有什麼特別的地方,這裏看它支持clone方法,但是注意所有的集合類型在克隆自定義的對象元素時,實際上都是淺拷貝,使用的時候需要特別注意。
2、關鍵屬性
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
從這兩個關鍵熟悉可以看出,實際上hashset就是基於hashmap實現的,只是value是一個固定的PRESENT對象而已,這樣整個實現還是比較好理解的,因爲hashmap的key是不允許重複,那麼基於這點我們正好可以用來實現Set中值不能重複的需求。
3、關鍵方法
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
使用的最頻繁的add方法,實際底層就是調用了map的put方法而已,這裏主要是要注意一下PRESENT它對於所有的Value值都是一樣的。
總結,hashset的整個原理還是比較清晰的,只有明白了hashmap的原理,hashset就沒有什麼特別的地方,它就是一個value固定的hashmap而已。