Java HashSet源码分析(JDK 1.8)
2019-03-20 本文已影响4人
小怪兽大作战
首先看一下HashSet的继承关系。
未命名文件.png
HashSet实现了set接口,内部使允许有重复的值。
成员变量
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
可以看到HashSet内部有两个成员变量,HashMap和Object。
构造方法
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
HashSet的构造方法都创建了HashMap对象。
add(Object o)
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
在HashSet的add方法中直接调用了map的put方法,key值就是我们添加的对象,value值是成员变量,也就是一个Object对象。
因此,HashSet内部是使用HashMap来实现的,存放的key就是我们添加的对象,存放的value就是一个Object对象。
remove(Object o)
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
contains(Object o)
public boolean contains(Object o) {
return map.containsKey(o);
}
其他方法都是基于HashMap来实现的,就不多说了。
总结:HashSet内部有一个HashMap,每放入一个A,就在内部的HashMap中放入这样一个结点:他的key是需要放入的对象,value是一个Object类型的成员变量。