HashSet源码分析——HashSet由哈希表实现
package java.util; import java.io.InvalidObjectException; import sun.misc.SharedSecrets; public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { private transient HashMap<E,Object> map; // 无参构造方法 public HashSet() { map = new HashMap<>(); } // 有参构造方法 public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } // 有参构造方法,创建的是一个LinkedHashMap HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); } // /ˈpreznt/ 现在的 private static final Object PRESENT = new Object(); public boolean add(E e) { /* 如果e是重复的,也就是key相同, * HashMap会用新的value覆盖旧的value, * 但在这里其实两个value是一样的,都是PRESENT * 接着返回旧的value,不等于null,最后返回false */ return map.put(e, PRESENT)==null; } public boolean remove(Object o) { return map.remove(o)==PRESENT; } }