你应该了解:
0、HashSet本质还是hashmap,只不过把hashmap的value统一设置为PRESENT
1、源码阅读顺序(建议):hashtable→hashmap→hashset
2、new HashMap<>(Math.max((int) (c.size() / .75f) + 1, 16));每一个参数的含义
3、如何插入和删除一个元素
4、线程不安全
继承
- HashSet继承AbstractSet抽象类和实现Set、Cloneable、Serializable接口。
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {
protected AbstractSet() {
}
public boolean equals(Object o) {
***
}
public int hashCode() {
***
}
public boolean removeAll(Collection<?> c) {
***
}
}
内置元素
- 底层以HashMap来实现,set就是map的key,然后将map的value统一格式化为PRESENT。
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);
}
如何添加一个元素
- hashset将map的
value
设置为PRESENT
然后调用hashmap来创建。
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
如何删除一个元素
- object o就是map里面的key,将他传到hashmap去删除就可以,无需理会value,只有返回时以value来判断是否删除成功。
public boolean remove(Object o) {
return map.remove(o) == PRESENT;
}
public V remove(Object key) {
Node<K,V> e;
return (e = removeNode(hash(key), key, null, false, true)) == null ?
null : e.value;
}