JAVA集合系列——HashSet实现原理
HashSet实现原理
特点
- 基于HashMap实现
- 无序
- 允许null值
- 元素不重复
- 非线程安全
数据结构和初始化
HashSet底层是基于HashMap实现的,它的所有数据都存放到HashMap中,更准确的说应该的HashMap的key中,所以无法保证有序,但保证元素的唯一性(HashMap的key是唯一的,本质还是通过key对象的equals和hashCode方法实现的),而HashMap的value值则直接赋值PRESENT常量。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26//基于HashMap
private transient HashMap<E,Object> map;
//常量PRESENT,用于设值HashMap的value
private static final Object PRESENT = new Object();
//默认构造,初始化了HashMap,HashMap默认的加载因子为0.75
public HashSet() {
map = new HashMap<E,Object>();
}
//指定初始容量
public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
//指定初始的容量和加载因子
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<E,Object>(initialCapacity, loadFactor);
}
//指定初始集合
public HashSet(Collection<? extends E> c) {
map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//指定初始容量和加载因子,实例下一个LinkedHashMap
//这个构造方法是包访问权限,是为LinkedHashSet提供的
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}
HashSet存取实现
存储
1 | //底层通过hashMap的put方法实现,如果以e对象为Key的元素在HashMap中不存在的 |
删除
1 | //底层通过HashMap的remove方法实现,HashMap的remove返回值为PRESENT表示remove成功 |
其他
1 | //使用HashMap的keySet迭代返回 |
相关
HashSet通过HashMap来实现数据的存取,所以很好的了解HashMap的实现原理对你了解HashSet会非常有帮助,具体可以参考HashMap实现原理