本系列文章所描述的所有類或接口都是基于 JDK 1.7的源碼,在其它 JDK 的實(shí)現(xiàn)方式中可能會有所不同难菌。
一刷后、實(shí)現(xiàn)方式
HashSet 是 Set 接口的實(shí)現(xiàn),Set 和 List 最明顯的區(qū)別在于 Set 不允許元素重復(fù)塘砸,而 List 允許。Set 為了做到不允許元素重復(fù)晤锥,采用的是基于 HashMap 來實(shí)現(xiàn)掉蔬,HashMap 在后面的系列中會詳細(xì)說明廊宪。
二、創(chuàng)建 HashSet
此時(shí)所要做的為創(chuàng)建一個(gè) HashMap 對象女轿。
public HashSet() {
map = new HashMap<>();
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
三挤忙、添加元素 add(E)
調(diào)用 HashMap 的 put(Object, Object) 方法來完成此操作,將需要增加的元素作為 Map 中的 key谈喳,value 則傳入一個(gè)之前已創(chuàng)建的 Object 對象。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
四戈泼、刪除元素 remove(E)
調(diào)用 HashMap 的 remove(E) 方法來完成此操作婿禽。
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
五号枕、判斷元素是否存在 contains(E)
調(diào)用 HashMap 的 containsKey(E) 方法來完成此操作丽惭。
public boolean contains(Object o) {
return map.containsKey(o);
}
六、遍歷元素 iterator
調(diào)用 HashMap 的 keySet 的 iterator 方法來完成此操作漾唉。
HashSet 不支持通過 get(int) 獲取指定位置的元素挽绩,只能自行通過 iterator 方法來獲取膛壹。
public Iterator<E> iterator() {
return map.keySet().iterator();
}
七、注意要點(diǎn)
對于 HashSet 而言唉堪,最要注意的有以下幾點(diǎn):
- HashSet 基于 HashMap 實(shí)現(xiàn)模聋,無容量限制;
- HashSet 是非線程安全的唠亚。