HashSet 实现了 Set 接口,是一个不包含重复元素的集合。经过源代码分析一下 HashSet 是如何作到元素不重复的。java
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
继承自 AbstractSet 抽象类,实现了 Set 接口spa
private transient HashMap<E,Object> map; private static final Object PRESENT = new Object();
定义了一个全局的 HashMap<E, Object> 还有一个 PRESET 的全局的静态变量,初始化为一个空的 Object。code
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); }
一共提供了4个构造方法,提供了一些不一样的参数,主要是 new 出一个新的 HashMap,设置不一样的容量和负载因子,因而可知 HashSet 的内部是经过 HashMap 实现的。对象
public boolean add(E e) { return map.put(e, PRESENT)==null; }
add 方法实际上是调用的 map 的 put 方法,将对象做为 key,PRESET 常量做为 value,放入全局的 map。经过 HashMap 不能含有重复 key 的特性来完成 "HashSet 不能包含重复值的" 的功能。继承
public boolean contains(Object o) { return map.containsKey(o); } public boolean remove(Object o) { return map.remove(o)==PRESENT; }
都是直接调用的 HashMap 的方法。接口
HashSet 的源码仍是比较简单的。基本稍微看一下源代码都能看懂。ci