//内部使用HashMap存储元素
private transient HashMap<E, Object> map;
//虚拟对象,用来作为value放到map中
private static final Object PRESENT = new Object();
//无参构造
public HashSet() {
map = new HashMap<>();
}
// 把另一个集合的元素全都添加到当前Set中
// 注意,这里初始化map的时候是计算了它的初始容量的
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size() / .75f) + 1, 16));
addAll©;
}
//带初始容量和负载因子的构造方法
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
//带初始化容量的构造方法
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
// LinkedHashSet专用的方法
// dummy是没有实际意义的, 只是为了跟上上面那个操持方法签名不同而已
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
//调用LinkedHashMap的构造方法
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
从源码可以看出:
-
构造方法都是调用
HashMap
对应的构造方法。 -
最后一个构造方法有点特殊,它不是
public
的,意味着它只能被同一个包调用,这是LinkedHashSet
专属的方法。
4.1 添加元素
//直接调用HashMap的put()方法
//把元素本身作为key,把PRESENT作为value,