hashset继承里abstractset类,实现了cloneable,serializable,set接口
内部是通过hashmap实现的
内部只有两个成员变量
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
//是所有写入 map 的 value 值。
private static final Object PRESENT = new Object();
构造函数是构造一个hashmap,如果传入参数,则有初始容量和负载因子
public HashSet() {
map = new HashMap<>();
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
比较关键的就是这个 add() 方法。 可以看出它是将存放的对象当做了 HashMap 的健,value 都是相同的 PRESENT 。由于 HashMap 的 key 是不能重复的,所以每当有重复的值写入到 HashSet 时,value 会被覆盖,但 key 不会收到影响,这样就保证了 HashSet 中只能存放不重复的元素。