死磕Jdk源码之HashSet:

本博客目前所有 死磕 Jdk 源码系列都是使用 jdk1.8版本。

简介

HashSetJava Collections API中的基本数据结构之一。
实现了CollectionSet接口

  • 存储唯一元素并允许空值
  • HashMap支持
  • 不保持插入顺序
  • 不是线程安全的

特性

数据结构

HashSet内部维护着一个HashMap,所有数据都是放在HashMap中,插入的数据为HashMapkey,这也就是为什么HashSet中的不能重复。

关于HashMap数据机构的,请移步死磕Jdk源码之HashMap

成员变量/常量

  • map HashMap实例,key为要插入的值,valuePRESENT常量,为Object实例

死磕源码

构造函数

默认构造函数,会初始化HashMap,也是使用默认构造器

1
2
3
public HashSet() {
map = new HashMap<>();
}

根据传入的Collection实例创建一个新的HashSet

1
2
3
4
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}

根据初始化容量和负载因子创建HashSet

1
2
3
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}

根据初始化容量创建HashSet

1
2
3
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}

根据初始化容量,负载因子构建HashSet,这里的初始化的MapLinkedHashMap类型

1
2
3
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

添加元素

直接调用mapput方法,mapkey就是我们要插入的元素

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

移除元素

同样是直接移除map对应的key

    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

总结

既然HashSet就是在维护一个HashMap对象,HashSet的性能也就取决于HashMap