TreeSet
TreeSet
是一个有序的集合,它的作用是提供有序的Set
集合。它继承了AbstractSet
抽象类,实现了NavigableSet<E>,Cloneable,Serializable
接口。TreeSet
是基于TreeMap
实现的,TreeSet
的元素支持2种排序方式:自然排序或者根据提供的Comparator
进行排序
private transient NavigableMap<E,Object> m;
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
// 创建一个默认的TreeMap并赋值给m
public TreeSet() {
this(new TreeMap<E,Object>());
}
// 创建一个带自定义排序方式的TreeMap并赋值给m
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
NavigableMap
继承于SortedMap
,同时本身也是TreeMap
的父类,所以第二三个构造方法创建的TreeMap
对象赋值给了m
TreeSet
重写addAll()
TreeSet#addAll()
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) {
SortedSet<? extends E> set = (SortedSet<? extends E>) c;
TreeMap<E,Object> map = (TreeMap<E, Object>) m;
Comparator<?> cc = set.comparator();
Comparator<? super E> mc = map.comparator();
if (cc==mc || (cc != null && cc.equals(mc))) {
map.addAllForTreeSet(set, PRESENT);
return true;
}
}
return super.addAll(c);
}
判断体的判断条件注意的是c instanceof SortedSet
,并且只有在新创建TreeSet
或TreeSet
元素为空的时候的时候才会进入这个判断,其他时候是进不来的;TreeSet
本身继承于SortedSet
,所以此时的c
等同于一个TreeSet
对象,然后分别获取到传入的集合和TreeSet
本身维护的TreeMap
中的比较器Comparator
,如果两个比较器相等,则直接将传入的set对象通过addAllForTreeSet
添加到TreeMap
中
TreeMap
维护着一颗红黑树,最后会将传入的set集合加入到红黑树中,具体的加入方法,会在Map<一>:TreeMap源码浅析一节中提到
如果进入不到判断体,则最终调用TreeSet
的add()
,将元素添加到集合中,其他的f方法则都在TreeMap
中实现