1. 程式人生 > >java集合(7):TreeSet原始碼分析(jdk1.8)

java集合(7):TreeSet原始碼分析(jdk1.8)

前言

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是關鍵。