java集合(7):TreeSet原始碼分析(jdk1.8)
阿新 • • 發佈:2019-02-01
前言
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是關鍵。