前言
TreeSet是基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。这句话什么意思呢?就是说,跟HashSet底层是一个HashMap来维护类似,TreeSet的底层实现就是一个TreeMap,自然也就具备了对元素排序的功能。
正文
源码分析
1,TreeSet类名及类成员变量
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable {
// 维护一个NavigableMap型变量,NavigableMap是TreeMap的接口
private transient NavigableMap<E,Object> m;
// PRESENT定义为静态常量,用来填充map的value位置
private static final Object PRESENT = new Object();
}
2,TreeSet类构造方法
// 非公有构造方法,不对外开放,共其他公有构造方法调用
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
public TreeSet() { // 1,默认空参构造方法
this(new TreeMap<E,Object>()); // 调用TreeMap类的无参构造方法
}
public TreeSet(Comparator<? super E> comparator) { // 2,自定义比较器的构造方法
this(new TreeMap<>(comparator)); // 调用TreeMap类的比较器构造方法
}
public TreeSet(Collection<? extends E> c) { // 3,已知集合构造成TreeSet
this();
addAll(c);
}
public TreeSet(SortedSet<E> s) { // 4,已知SortedSet型集合构造成TreeSet
this(s.comparator()); // 使用已知集合的比较器对象
addAll(s);
}
3,TreeSet常用方法,都是调用Treemap中的方法,只是在添加的时候用静态常量PRESENT来填充map的value位置。
4,iterator()迭代器方法,返回的就是map的keySet的迭代器。
总结
TreeSet底层实现严重依赖于TreeMap,所以弄清楚TreeMap是关键。