HashSet和TreeSet
HashSet
我们来看一下HashSet的构造方法:1
2
3
4
5
6
7public HashSet() {
map = new HashMap<>();
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
...
其余的就不贴了,可以发现内部完全就是生成了一个HashMap。我们知道,Set只有一个值,而且不能重复,这和Map的key很像。其实就是这样,Set只使用了key,而value就是一个Object,从add方法可以看出来:1
2
3
4
5public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
//PRESENT的定义
private static final Object PRESENT = new Object();
其他也没什么好谈的,完全就是调用HashMap的方法。
TreeSet
与HashSet类似,TreeSet内部创建了一个TreeMap,所有的方法都来源于TreeMap。
小结
感觉上HashSet和TreeSet很敷衍,完全是包装了一下HashMap和TreeMap。因为Map有value,Set实现Map浪费了很多的空间来装Object对象。完全可以写出类似的数据结构来提高效率啊!这一点我们需要注意。对于性能要求较高的场合,完全可以自己手动重新写一个Set来完成任务。