上一篇文章我们介绍了HashMap的实现,现在我们学校HashSet就很容易啦。这里提一点的是,HashMap并不是Collection接口的实现类,它只是Map
1.构造方法
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
HashSet有五个构造方法,其中前四个是用HashMap实现,最后一个是LinkedHashMap
(1)使用无参构造时,其实内部新建了一个Capacity为16,loadFactor为0.75的哈希表。
(2)参数为一个集合时,则是构建一个capacity为集合size/loadFactor的哈希表(小于DEFAULT_INITIAL_CAPACITY则为16)。
(3)设置哈希表的initialCapacity和loadFactor。
(4)单设置哈希表的initialCapacity。
(5)生成LinkedHashMap,为顺序存储。
2.Value字段
private static final Object PRESENT = new Object();
该字段是static final修饰的,是类共享的,其存储的其实就是每个存储单元entry中的Value,这样每次就不需要再构建新的对象了。
3.增删改查
set的增删查改完全使用map操作,不再赘述。
4.iterator()方法
public Iterator<E> iterator() {
return map.keySet().iterator();
}
直接调用map的Keyset的迭代器即可~
5.总结
HashSet完全是HashMap的一种封装(也可以使用LinkedHashSet),因此也是线程不安全的,也用于fast-fail机制等。不过它内部实现的map中,所有的Value都是一个static final Object对象,优化了操作。