HashSet 是基于 HashMap 来实现的,HashMap 存放键值对,而 HashMap 只存放对象。
HashSet 的源码很简单,其实只需要弄懂 HashSet 的源码即可,可以参考:HashMap源码分析
属性
其属性很简单,一个 HashMap 对象,一个静态的空对象。
// HashSet基于HashMap来实现的
private transient HashMap<E,Object> map;
// 一个静态的Object对象,没有什么意义,只是作为HashMap中键值对的值能put进去
private static final Object PRESENT = new Object();
构造函数
几个构造函数可以参考 HashMap 的构造函数。
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);
}
// 这个是LinkedHashSet的构造函数,当然是LinkedHashMap来实现
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
基本方法
方法基本都是 HashMap 的相关方法。
这里只说明一个 add 方法,其调用 HashMap 的 put 方法,将键值对插入 HashMap 中,只不过键值对中的值是一个无意义的空对象。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}