1、對於HashSet需要掌握以下幾點
- HashSet的創建:HashSet()
- 往HashSet中添加單個對象:即add(E)方法
- 刪除HashSet中的對象:即remove(Object key)方法
- 判斷對象是否存在於HashSet中:containsKey(Object key)
注:HashSet沒有獲取單個對象的方法,需要使用iterator
2、構建HashSet
源代碼:
//HashSet底層數據結構:通過hashmap的key不可重複的原則,使得存放入HashSet中的值不重複 private transient HashMap<E, Object> map; //默認的hashmap的value private static final Object PRESENT = new Object(); /** * 可存放16個元素 */ public HashSet() { map = new HashMap<E, Object>(); } /** * 指定hashset的容量和負載因子 */ public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<E, Object>(initialCapacity, loadFactor); } /** * 指定hashset的容量 */ public HashSet(int initialCapacity) { map = new HashMap<E, Object>(initialCapacity); }
注:HashSet的底層是HashMap,其依靠HashMap的key不可重複,來保證將來加入到HashSet中的元素也不重複(會將元素作爲key放到hashmap中,參照3)。
3、add(E e)
源代碼:
add(E e)
/** * 往set中添加值 */ public boolean add(E e) { //查看hashmap的put方法,若覆蓋已有key的舊值,會返回舊值;若沒有相應的key則返回null return map.put(e, PRESENT) == null; }
注意:這裏調用了HashMap的put(K key, V value)
4、remove(Object key)
源代碼:
/** * 刪除指定元素 */ public boolean remove(Object o) { return map.remove(o) == PRESENT; }
注:這裏調用了HashMap的remove(Object key)
5、contains(Object key)
源代碼:
/** * set中是否包含指定元素 */ public boolean contains(Object o) { return map.containsKey(o); }
注意:這裏調用了HashMap的containsKey(Object key)
總結:
- HashSet底層就是HashMap
- 其依靠HashMap的key不可重複,來保證將來加入到HashSet中的元素也不重複(會將元素作爲key放到hashmap中)
- HashSet線程不安全