HashSet源码解析

前言

HashSet其实实现很简单,也很取巧。

底层结构

1
2
3
4
5
6
private transient HashMap<E,Object> map;

private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}

看构造函数就知道里面存了一个HashMap,而那个PRESENTObject的作用就是给每个存进Set的对象的value。

基本方法

1
2
3
4
5
6
7
8
9
10
11
12
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public Iterator<E> iterator() {
return map.keySet().iterator();
}

这三个基本方法可以看出,其实HashSet就是封装了一个HashMap,每次存一个对象其实就是在Map中放了一个key -> Object, 那个Object是共享的。
而iterator方法返回的是keySetiterator