源码解析-HashSet
# 概述
HashSet的实现方式比较简单,底层是在HashMap的基础上包装了一层,根据HashMap的特性,HashSet主要有以下特点
- 可以实现元素去重保证集合元素唯一
- 允许null元素
- 线程不安全,使用
Collections.synchronizedSet(new HashSet(…))
来实现线程安全 - 迭代器实现是fail-fast的,在迭代的时候修改元素会抛出ConcurrentModificationException
# 构造函数
//底层用来存储的HashMap实例
private transient HashMap<E,Object> map;
//HashSet存放元素的时候是放在HashMap的key里的,需要一个没有任何意义的value
private static final Object PRESENT = new Object();
//直接初始化底层的map
public HashSet() {
map = new HashMap<>();
}
//传入指定集合,相当于初始化存入一些数据,调用HashMap实现
//这里HashMap初始化的时候指定的容量大小 可以参考HashMap源码解析文章中的容量设置问题,可以看到官方也是这样使用的
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//直接指定初始化大小
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 方法解析
# add()
//调用HashMap直接put
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# remove()
//调用map的remove方法
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
1
2
3
4
2
3
4
上次更新: 2024/11/06, 02:51:54