從原始碼可見,TreeSet 本質上是 TreeMap 的一層薄包裝。它實作了 NavigableSet、Cloneable、Serializable 介面,其中 NavigableSet 繼承自 SortedSet。
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable {
// 底層使用 NavigableMap 實作,鍵為元素,值為固定物件 PRESENT
private transient NavigableMap<E, Object> m;
private static final Object PRESENT = new Object();
// 內部建構子,直接注入 NavigableMap
TreeSet(NavigableMap<E, Object> m) {
this.m = m;
}
// 預設建構子,使用自然排序的 TreeMap
public TreeSet() {
this(new TreeMap<E, Object>());
}
// 客製化比較器建構子
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
// 從 Collection 建構
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
// 從 SortedSet 建構
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
// ... 後續方法皆委派給內部 TreeMap 實作
}
Comparator 實現客製化排序,內部邏輯不感知具體比較策略PRESENT 常數add、remove、contains、迭代器等)皆轉發給內部 TreeMaplower、floor、ceiling、higher、pollFirst、pollLast 等進階查詢subSet、headSet、tailSet 提供高效區間查詢writeObject/readObject 確保比較器與元素順序正確還原| TreeSet 方法 | 委派目標 | 說明 |
|---|---|---|
add(E e) | m.put(e, PRESENT) == null | 新增元素,回傳是否為新增成功 |
remove(Object o) | m.remove(o) == PRESENT | 移除元素 |
contains(Object o) | m.containsKey(o) | 判斷是否包含 |
iterator() | m.navigableKeySet().iterator() | 遞增順序迭代器 |
descendingIterator() | m.descendingKeySet().iterator() | 遞減順序迭代器 |
first() | m.firstKey() | 取得最小元素 |
last() | m.lastKey() | 取得最大元素 |
subSet(...) | new TreeSet<>(m.subMap(...)) | 區間視圖 |
add、remove、contains)時間複雜度:O(log n)Collections.synchronizedSortedSetConcurrentModificationException詳細原始碼請參考 JDK 官方文件或 java.util.TreeSet 來源。