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();
}
四、總結
- TreeSet的數據結構是TreeMap,元素值保存在TreeMap的key中。
- 由於TreeMap對key的要求,TreeSet的元素要麼實現Comparator接口,要麼實現Comparable接口。
- TreeSet的使用場合是要求集合具有排序不重複的性質。