1、简述
- 本篇内容我们来聊聊我们日常开发中经常使用的一个类 HashSet,相信大家都不陌生。
2、归纳
- 继承了 AbstractSet 抽象类,实现了 Set 接口,实现了 Cloneable 和 Serializable 接口,所以支持复制(拷贝)、序列化。
- 默认容量为16,负载因子0.75,其实内部就是包装了一个 HashMap,HashMap 的 key 放的是其存入的值,value 放的是一个 Object 对象。
- 单线程安全,多线程不安全。
3、分析
3.1、成员变量
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
...
}
3.2、构造方法
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
...
public HashSet() {
map = new HashMap<E, Object>();
}
public HashSet(int initialCapacity) {
map = new HashMap<E, Object>(initialCapacity);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<E, Object>(initialCapacity, loadFactor);
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<E, Object>(Math.max((int) (c.size() / .75f) + 1, 16));
addAll(c);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E, Object>(initialCapacity, loadFactor);
}
...
}
3.3、增操作
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
...
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
...
}
3.4、删操作
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
...
public boolean remove(Object o) {
return map.remove(o) == PRESENT;
}
...
}