前言
了解HashSet基本数据结构,了解它一些方法的底层实现,以便更好的编程。
一、数据结构
其底层是HashMap实现,简化版的HashMap,因此查询效率和删除效率都高,但线程不安全,未做线程同步。
HashMap的底层又是数组+链表(或红黑树,链表长了就转红黑树,红黑树删除节点少了就转成链表。)
private transient HashMap<E,Object> map;
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
可以看到它用一个HashMap作为它的基本属性。
二、添加元素
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
用该元素作为Map的key,而Map的Value随便用一个final Object对象,这样节约了好多空间。相当于一个Y,N 个X与其对应。
总结
1)HashSet的底层是HashMap,更多源码分析要关联HashMap的源码分析
参考文献
[1] [JDK 1.12]