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; }