JDK8集合类源码解析

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