HashMap
是一种常见的Set
接口的实现,不包含重复的元素,其层次结构如下。
HashSet
是基于HashMap
实现的,因此HashSet
代码量远少于HashMap
。
无参构造器和其它几个带参构造器的主要工作就是把map
字段初始化为一个HashMap
类型的实例。
private transient HashMap<E,Object> map;
public HashSet() {
map = new HashMap<>();
}
该方法是唯一一个把map
字段初始化为一个LinkedHashMap
实例的构造器,LinkedHashMap
是HashMap
的子类。
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
增加元素的操作底层调用的是Map
的put()
方法,PRESENT
对象是一个静态常量,在这里没有实际含义,仅仅是因为put()
方法必须传入一个键值对。
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
移除元素的方法同样也是调用Map
的remove()
方法。
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
底层调用Map
的containsKey
方法。
public boolean contains(Object o) {
return map.containsKey(o);
}