主要内容:
- HashSet继承关系
- 关键属性
- 构造函数
HashSet概述
- 没有重复元素的集合。底层基于HashMap来实现。
- 非线程安全,创建线程安全的HashMap可以使用
Collections.synchronizedSet
。
Set s = Collections.synchronizedSet(new HashSet(...));
源码分析
继承关系
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
- 继承AbstractSet抽象类,实现Set接口
- 实现java.io.Serialization接口,支持序列化
- 实现Cloneable接口,支持对象克隆,浅复制
关键属性
//使用HashMap来保存HashSet的元素
private transient HashMap<E,Object> map;
//HashSet只使用到key,因此使用一个静态常量来充当HashSet的value值
private static final Object PRESENT = new Object();
PRESENT
这个变量到底是用来干嘛的??
构造函数
//使用默认容量大小16以及加载因子0.75初始化HashMap,构造HashSet
public HashSet() {
map = new HashMap<>();
}
//初始化指定集合和默认加载因子0.75的map,构造HashSet
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//使用指定容量大小和加载因子初始化map,构造HashSet
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
//使用指定容量大小和默认加载因子0.75初始化map,构造HashSet
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
//包访问权限,构造空的LinkedHashSet
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}