java集合(7):TreeSet源码分析(jdk1.8)

时间:2021-07-21 19:36:42

前言

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是关键。