TreeSet底层依赖TreeMap的实现
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable {
// 使用NavigableMap的key来保存Set集合的元素
private transient NavigableMap<E, Object> m;
// 使用一个PRESENT作为Map集合的所有
private static final Object PRESENT = new Object();
// 根据指定的NavigableMap对象创建Set集合
TreeSet(NavigableMap<E, Object> m) {
this.m = m;
}
// 以自然排序方式创建TreeMap,使用该TreeMap的key来保存Set集合的元素
public TreeSet() {
this(new TreeMap<E, Object>());
}
// 以定制排序方式创建TreeMap,使用该TreeMap的key来保存Set集合的元素
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public TreeSet(SortedSet<E> s) {
// 调用前面的构造器,底层以TreeMap保存集合元素
this(s.comparator());
// 向TreeSet中添加SortedSet集合s的所有元素
addAll(s);
}
/*
* TreeSet的其他方法都是直接调用TreeMap方法实现
*/
public boolean addAll(Collection<? extends E> c) {
// Use linear-time version if applicable
if (m.size() == 0 && c.size() > 0 && c instanceof SortedSet && m instanceof TreeMap) {
//将c集合强制转换为SortedSet集合
SortedSet<? extends E> set = (SortedSet<? extends E>) c;
//将m集合强制转换为TreeMap集合
TreeMap<E, Object> map = (TreeMap<E, Object>) m;
Comparator<?> cc = set.comparator();
Comparator<? super E> mc = map.comparator();
//如果cc和mc两个comparator相等
if (cc == mc || (cc != null && cc.equals(mc))) {
//把Collection所有元素添加成TreeMap集合的key
map.addAllForTreeSet(set, PRESENT);
return true;
}
}
//调用父类的addAll()方法来实现
return super.addAll(c);
}
}