java集合框架(十一):TreeSet

開發十年,就只剩下這套架構體系了! >>>   hot3.png

TreeSet是可排序不重複的集合,其數據結構是TreeMap(點擊此處瞭解原理),TreeSet的值就存儲在TreeMap的key中。下面就來看看具體實現。

一、類的定義

public class TreeSet<E> extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable
{
    // 使用導航map而不是TreeMap,其實是爲了讓TreeSet實現NavigableSet的方法
    private transient NavigableMap<E,Object> m;
    // TreeMap的value,爲了不重複創建對象共用同一個對象
    private static final Object PRESENT = new Object();
}

類繼承關係如下:

輸入圖片說明

導航set(NavigableSet)和排序set(SortedSet)中定義一些方法,實現類必須實現,TreeSet實現了NavigableSet和SortedSet接口,所以其都實現了這些方法。 輸入圖片說明輸入圖片說明

二、構造函數

TreeSet有多個構造器,我們根據需要選擇。

// 默認構造器,直接new一個TreeMap作爲參數重載構造器
public TreeSet() {
        this(new TreeMap<E,Object>());
}

// 該構造器只有同包類才具有訪問權限
TreeSet(NavigableMap<E,Object> m) {
        // 給屬性m賦值
        this.m = m;
}

// 把集合參數加入到TreeSet
public TreeSet(Collection<? extends E> c) {
        this();
        addAll(c);
}

// 傳入比較器
public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
}

// 傳入排序set
public TreeSet(SortedSet<E> s) {
        this(s.comparator());
        addAll(s);
}

三、存儲的實現

1.add()方法。直接調用導航map(其實大部分情況下就是實現類TreeMap)的put方法,key爲我們要存儲的元素,value共用PRESENT。

public boolean add(E e) {
        return m.put(e, PRESENT)==null;
}

2.clear()方法。直接調用導航map的clear()方法。

public void clear() {
        m.clear();
}

3.remove(Object o)方法。

public boolean remove(Object o) {
        return m.remove(o)==PRESENT;
}

4.iterator() 方法。

public Iterator<E> iterator() {
        return m.navigableKeySet().iterator();
 }

四、總結

  1. TreeSet的數據結構是TreeMap,元素值保存在TreeMap的key中。
  2. 由於TreeMap對key的要求,TreeSet的元素要麼實現Comparator接口,要麼實現Comparable接口。
  3. TreeSet的使用場合是要求集合具有排序不重複的性質。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章