HashSet
特点:不允许放入重复元素
查看源码,发现HashSet是基于HashMap来实现的,对HashMap做了一次“封装”。
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object(); //map的value
构造函数
//空的构造函数
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);
}
基本操作
public boolean add(E e) {
return map.put(e, PRESENT)==null;
} public boolean remove(Object o) {
return map.remove(o)==PRESENT;
} public boolean contains(Object o) {
return map.containsKey(o);
} public int size() {
return map.size();
}
最佳实践:
1 HashSet底层就是HashMap,只要理解了 hashmap,HashSet自然就理解了。
2 HashSet中的数据不可重复
3 HashSet线程不安全
4 实际开发中,如果能够预料set的大小,建议优先使用带容量的构造器,好提高性能。
我的另一篇文章,JDK8集合类源码解析 - HashMap