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 方法进行元素删除
朔风