Skip to content
章节导航

HashSet 核心源码

HashSet 的底层是 HashMap,而且 HashSet 并不保证有序性,允许保存空值(null),非线程安全

基本属性

  • HashSet 的重要属性 Map,其底层是 HashMap
  • Object 类型的 PRESENT 属性用于 HashMap 中 value 的占位
shell
transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    static final Object PRESENT = new Object();

构造函数

1、默认构造函数

创建一个初始容量为 16、负载因子为 0.75 的HashMap,

shell
public HashSet() {
        map = new HashMap<>();
    }

2、通过传入集合C来初始化 HashSet

这个构造函数,它会传入一个 collection 类型参数,并根据集合大小计算合适的初始容量,最终调用 addAll 方法添加

shell
public HashSet(Collection<? extends E> c) {
        map = HashMap.newHashMap(Math.max(c.size(), 12));
        addAll(c);
    }

3、指定初始容量和负载因子的构造函数用于更灵活的初始化

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

4、仅指定初始容量的构造函数,默认负载因子为0.75

shell
public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

添加元素

HashSet 添加元素是使用 add(),通过调用 HashMap 的 put 方法添加元素,如果元素已存在,则不会重复添加并返回 false。

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

TreeSet 简介及常用方法

  • TreeSet 底层结构是 TreeMap
  • add 方法最终调用 TreeMap 的 put 方法进行元素添加
  • remove 方法调用 TreeMap 的 remove 方法进行元素删除