HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
HashSet依赖于HashMap实现
1.类变量&常量
transient HashMap<E,Object> map; //HashSet主要实现的数据结构
static final Object PRESENT = new Object(); //在HashMap中,与Set的key相关联的值,为常量
2.构造函数
//默认构造方法
public HashSet() {
map = new HashMap<>(); //调用HashMap的无参构造方法
}
//加入容器类的构造方法
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); //调用HashMap初始容量的构造方法
//addAll()方法为AbstractCollection中方法,默认循环调用add()方法
addAll(c);
}
//有初始容量和装载因子的构造方法
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
//只有初始容量的构造方法
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
3.重要函数
1.add方法,添加元素进HashSet
public boolean add(E e) {
return map.put(e, PRESENT)==null; //PRESENT作为了value
}
2.contains(Object o)方法,是否包含元素
public boolean contains(Object o) {
return map.containsKey(o); //HashMap中的containsKey方法
}
3.clone方法,克隆一个新的HashSet
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone(); //map.clone()将map中元素添加到新的容器中
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
4.iterator方法,返回一个Iterator用来遍历
public Iterator<E> iterator() {
//使用map.keySet()中的iterator()方法来实现
//其中keySet()放回一个内部类KeySet,其内部实现了iterator方法,返回一个KeyIterator类
//KeyIterator类实现了next方法,返回HashIterator.nextNode().key
return map.keySet().iterator();
}
5.size方法,返回HashSet中的元素个数
public int size() {
return map.size();
}
6.remove(Object o)方法,删除指定元素
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
7.clear函数,清除HashSet中的元素
public void clear() {
map.clear();
}