TreeSet 是 Java 集合框架中實現排序功能的核心類,基於紅黑樹結構,能夠自動維持元素的有序性。與 LinkedHashSet 維持插入順序不同,TreeSet 根據自然順序或自定義比較器進行排序。
| 特性 | TreeSet | LinkedHashSet |
|---|---|---|
| 順序維護 | 自然排序/自定義排序 | 插入順序 |
| 底層結構 | 紅黑樹 | 雙向鏈表 + HashMap |
| 性能 | O(log n) | O(1) |
public static void testNature() {
// 整數自然排序
TreeSet<Integer> set = new TreeSet<>();
for (int i = 10; i >= 1; i--) set.add(i);
showSet(set); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// 字符串自然排序(按字符編碼)
TreeSet<String> set2 = new TreeSet<>();
for (int i = 10; i >= 1; i--) set2.add(i + "");
showSet(set2); // [1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
}
// 反向排序
TreeSet<Integer> set = new TreeSet<>(new MyIntegerComparator());
// 匿名內部類:奇數優先,偶數在後,均降序
TreeSet<Integer> set2 = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
boolean o1Odd = o1 % 2 != 0;
boolean o2Odd = o2 % 2 != 0;
if (o1Odd && o2Odd) return o2.compareTo(o1);
if (o1Odd) return -1;
if (o2Odd) return 1;
return o2.compareTo(o1);
}
});
// 使用統一字符串比較避免 ClassCastException
TreeSet set = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
}
});
for (int i = 10; i >= 1; i--) {
set.add(i);
set.add(i + "");
}
