集合容器学习之Set

Set表示集合的意思,是三大容器中最简单的一种。

HashSet和TreeSet

HashSet

我们来看一下HashSet的构造方法:

1
2
3
4
5
6
7
public 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
5
public 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来完成任务。