HashSet 是通过 HashMap 实现的。
LinkedSet 是通过 LinkedHaspMap 实现的。
果然,TreeSet 是通过 TreeMap 来实现的。
我们来看一下 TreeSet 的 add 方法的实现:
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
private transient NavigableMap<E,Object> m;
private static final Object PRESENT = new Object();
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
public TreeSet() {
this(new TreeMap<E,Object>());
}
与 HashSet 一样,每次 add 一个新元素的时候,都只是往 map 里面加入一个新元素。
默认的 map 是 TreeMap, 当然也可以传入一个自定义的 NavigatleMap,至于 NavigatleMap 的特性,等看到 Map 那一部分的时候再说。
因为保证有序,不管是通过什么树来实现有序的(比如红黑树),都能保证 O(lg(n)) 的时间复杂度。
与其他大所述 java.util 里面的集合类一样,这个类不是同步的,不过可以通过下面的方法人为同步:
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
参考链接:
1. https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html