JDK8集合类源码解析 - HashSet

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

上一篇:伯克利DB的一个BUG


下一篇:spark 创建稀疏向量和矩阵