HashSet源码分析

释放双眼,带上耳机,听听看~!

简介

基于HashMap的Set接口实现。它不保证集合的迭代顺序。特别是,它不能保证顺序会随着时间的推移保持恒定,当扩容时顺序将调整。此类允许null元素。

类继承关系

HashSet源码分析

属性


1
2
3
4
5
6
1   -- 创建的HashMap
2    private transient HashMap<E,Object> map;
3   -- 因为底层使用HashMap实现,要存key,value,这个固定值就是所有数据的value了
4    private static final Object PRESENT = new Object();
5
6

构造方法


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1-- 这里构造方法是创建了一个HashMap
2public HashSet() {
3   map = new HashMap<>();
4}
5public HashSet(int initialCapacity, float loadFactor) {
6    map = new HashMap<>(initialCapacity, loadFactor);
7}
8public HashSet(int initialCapacity) {
9    map = new HashMap<>(initialCapacity);
10}
11public HashSet(Collection<? extends E> c) {
12    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
13    addAll(c);
14}
15-- 给LinkedHashSet使用
16HashSet(int initialCapacity, float loadFactor, boolean dummy) {
17    map = new LinkedHashMap<>(initialCapacity, loadFactor);
18}
19
20

方法


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
27
28
29
30
31
32
33
34
35
36
1-- 添加 调用map的put方法
2public boolean add(E e) {
3    return map.put(e, PRESENT)==null;
4}
5public boolean remove(Object o) {
6    return map.remove(o)==PRESENT;
7}    
8public void clear() {
9map.clear();
10}
11public boolean isEmpty() {
12    return map.isEmpty();
13}
14public int size() {
15    return map.size();
16}
17-- hashset没有提供get方法
18public boolean contains(Object o) {
19    return map.containsKey(o);
20}
21-- 调用map的keyset迭代 更像是hashmap留下的钩子
22public Iterator<E> iterator() {
23    return map.keySet().iterator();
24}
25-- 重写克隆方法 实现深拷贝
26public Object clone() {
27    try {
28        HashSet<E> newSet = (HashSet<E>) super.clone();
29        newSet.map = (HashMap<E, Object>) map.clone();
30        return newSet;
31    } catch (CloneNotSupportedException e) {
32        throw new InternalError(e);
33    }
34}
35
36

总结

内部使用HashMap的key存储元素,来保证数据不重复
线程不安全
无序
允许key为null
没有get方法
支持快速失败

给TA打赏
共{{data.count}}人
人已打赏
安全经验

人们为何痛恨Google Adsense

2021-10-11 16:36:11

安全经验

安全咨询服务

2022-1-12 14:11:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索