TreeSet的底层是用TreeMap实现的。在构造方法中会创建一个TreeMap实例,用于存放元素,另外TreeSet是有序的,也提供了制定比较器的构造函数,如果没有提供比较器,则采用key的自然顺序进行比较大小,如果指定的比较器,则采用指定的比较器,进行key值大小的比较。
add()方法和remove()方法都比较的简单,都是调用TreeMap的方法进行实现。
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable {
//存放元素的map对象
private transient NavigableMap<E,Object> m;
//key-value ,不同的键都会对象相同的value, value = PRESENT
private static final Object PRESENT = new Object();
//指定的map对象
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
//无参构造方法,初始化一个TreeMap对象
public TreeSet() {
this(new TreeMap<E,Object>());
}
//构造方法,指定比较器
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
//将集合中的元素转化为TreeSet存储
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
//构造方法,SortedSet转化为TreeSet存储,并使用SortedSet的比较器
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
//遍历方法,返回m.keyset集合
public Iterator<E> iterator() {
return m.navigableKeySet().iterator();
}
//逆序排序的迭代器
public Iterator<E> desce