HashSet源码分析
简介
HashSet不能存放重复的值,且不保证存放的顺序。
类结构
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
HashSet继承自AbstractSet并重写了方法
HashSet实现可Cloneable接口,可被克隆
HashSet实现了Serializable接口,可以被序列化
属性
//维护了一个HashMap,正是用这个HashMap来实现的去重
private transient HashMap<E,Object> map;
//用于HashMap存放时的value,节约空间
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);
}
//同指定初始化大小和加载因子的构造器,第三个参数预留
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
方法
iterator()获取迭代器
public Iterator<E> iterator() {
//使用的是HashMap的KeySet的迭代器
return map.keySet().iterator();
}
contains(Object)方法判断HashSet中是否已经包含该元素了
public boolean contains(Object o) {
//直接调用HashMap的方法判断是否包含key
return map.containsKey(o);
}
add(E)方法添加元素
public boolean add(E e) {
//把元素当做是key,value用预设的默认值,即用HashMap不能存放重复key的特性去重
return map.put(e, PRESENT)==null;
}
remove(Object)方法移除元素
public boolean remove(Object o) {
//把HashMap中key对应的节点去除
return map.remove(o)==PRESENT;
}