HashSet那点事儿

HashSet那点事儿

薛定谔的汪

在复习完 HashMap 后,今天学习 HashSet,在日常开发中我们常用它来存储不重复元素, HashSet 是基于 HashMap 的,它巧妙地利用了 HashMap 的 key 不可重复的特性,我们在向 HashSet 中添加元素时,实际上是把添加的元素当做 HashMap 的 key ,当有重复的元素进来时,表示 HashMap 中存在相同的 key,新的value 会覆盖原来的value ,理解了 HashMap 后 HashSet 就很容易理解了。

核心属性

1
2
3
4
5
//HashSet 基于 HashMap 实现
private transient HashMap<E,Object> map;

//一个虚拟的value,无意义。在 HashSet 的 HashMap 中,任何 key 的值都是这个 PRESENT
private static final Object PRESENT = new Object();

构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14

public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}

我们发现 HashSet 的构造方法都是创建了一个 HashMap

常用方法

add

1
2
3
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

可以看到 HashSet 的添加方法其实就是把要添加的元素 e 当做 HashMap 的 key,而 value 都是 PRESENT,这样就实现了 HashSet 中的元素不重复。

其他的方法基本也是借助 HashMap 来实现的。

总结

HashSet 的实现非常简单,就是借助 HashMap的 key 不可重复来实现去重的,所以 HashSet 也不是线程安全的。

  • Title: HashSet那点事儿
  • Author: 薛定谔的汪
  • Created at : 2018-07-20 18:01:54
  • Updated at : 2023-11-17 19:37:37
  • Link: https://www.zhengyk.cn/2018/07/20/java/HashSet/
  • License: This work is licensed under CC BY-NC-SA 4.0.
On this page
HashSet那点事儿