HashSet持有HashMap的引用,是基于HashMap实现的
HashSet的特点:
-
集合里不能存在重复元素(怎么定义重复元素:hashcode值相同且 equals匹配成功的元素,不会被覆盖)
-
允许null值 (有且只能存储一个)
-
查找效率高(基于HashMap)
HashSet实现原理:
-
基于HashMap,集合里的每一个元素是HashMap的key值,HashMap的value值固定为PRESENT
-
PRESENT是HashSet中的私有静态常量
-
contains(obj) 判断的是map.containsKey(obj)
-
iterator() 执行的是map.keyset().iterator()
-
hashSet的add(e)和remove(obj)返回boolean值
-
add(e) 如果hashMap不存在同样的key值(hashcode 或者 equals不匹配),则添加成功,返回true;否则针对同一个元素,value值覆盖(虽然我们这里的value值固定是个常量),返回false
-
remove(obj) 如果hashMap中不存在同样的key值,移除失败,返回false;否则移除成功,返回true
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
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);
}
public Iterator<E> iterator() {
return map.keySet().iterator();
}
public int size() {
return map.size();
}
public boolean isEmpty() {
return map.isEmpty();
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public void clear() {
map.clear();
}
}