HashSet,顾名思义,我们可以得到两点信息:
1. 实现了 Set 接口。
2. 通过 Hash 表实现。所以它的 element 是无序的。
下面看一下 add 方法的源码:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
原来 HashSet 是通过 HashMap 实现的,刚看到这样的实现的时候,我想立马反对一下这种做法:
1. 对于 HashSet 里面的每个 element,都需要存一个 PRESENT 的对象,即浪费空间,又浪费时间。
后来又一想,如果我是 这段代码的作者,我可以这这样解释:
1. 减少代码冗余,相同的 hash 逻辑,只需要维护一份就可以了。
2. 关于空间浪费,PRESENT 是 static final 的,也就是说,在对空间中只有一份,空间浪费可以忽略不计。对于每个 element 的存的指针空间,空间也不大。
我网上搜了一下,也没有什么特别信服人的理由,它就是通过这种方法来实现了而已。
参考链接:
1. https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html