HashSet源码解析 --基于JDK1.8

文章目录

    • 结构
    • 属性
    • 构造器
    • 方法
      • add:

结构

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
}

HashSet继承自AbstractSet,实现了Set, Cloneable, java.io.Serializable接口。

属性

	//序列化id
    static final long serialVersionUID = -5024744406713321676L;
	
	//底层用HashMap存储数据
    private transient HashMap<E,Object> map;

    // HashMap的value部分
    private static final Object PRESENT = new Object();

构造器

	//默认构造器,new 一个HashMap
    public HashSet() {
        map = new HashMap<>();
    }

    //传入集合,HashMap的初始容量为(Math.max((int) (c.size()/.75f) + 1, 16)
    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);
    }

    //传入初始容量和加载因子,以及dummy。dummy被忽略,用于区分其他构造器。
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

方法

add:

public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

调用HashMap的put方法。
详见HashMap源码解析

你可能感兴趣的:(HashSet源码解析 --基于JDK1.8)