TreeSet 是基于红黑树实现的有序去重集合,按自然顺序或自定义 Comparator 排序,插入即排序且自动忽略重复元素,支持 first/last、higher/lower 等有序操作,时间复杂度均为 O(log n)。

TreeSet 是 Java 集合框架中基于红黑树(Red-Black Tree)实现的 SortedSet,它天然支持元素的自动排序和去重,无需额外调用 sort() 或手动检查重复。
TreeSet 的排序原理
TreeSet 默认按元素的自然顺序(即实现 Comparable 接口的 compareTo() 方法)升序排列。如果元素未实现 Comparable,或你想自定义排序逻辑,可传入 Comparator 实现类或 Lambda 表达式。
- 基本类型包装类(如
Integer、String)已实现Comparable,可直接使用 - 自定义类需实现
Comparable,或在创建 TreeSet 时提供Comparator - 插入重复元素时,TreeSet 会忽略(不报错、不覆盖),保证集合内无重复
基本用法示例
以 Integer 为例:
TreeSet<Integer> set = new TreeSet<>(); set.add(5); set.add(1); set.add(3); set.add(5); // 重复,被忽略 System.out.println(set); // [1, 3, 5] —— 自动升序且去重
输出结果为 [1, 3, 5],说明插入即排序,重复值不生效。
立即学习“Java免费学习笔记(深入)”;
对自定义对象排序与去重
假设有一个 Person 类,按年龄排序:
- 方式一:让
Person实现Comparable<person></person>,重写compareTo() - 方式二:创建 TreeSet 时传入
Comparator,例如:TreeSet<person> set = new TreeSet((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));</person> - 注意:
equals()和compareTo()的逻辑应保持一致,否则可能造成“逻辑重复但未被去重”的问题(例如两个Person年龄相同但姓名不同,若仅按年龄比较,则视为重复)
常用操作与注意事项
TreeSet 提供了丰富的有序集合操作:
-
first()/last():获取最小/最大元素 -
higher(e)/lower(e):返回严格大于/小于e的最小/最大元素 -
subSet(from, to):获取子区间(左闭右开) - 线程不安全,多线程环境下需手动同步,或使用
Collections.synchronizedSortedSet() - 时间复杂度:插入、删除、查找均为 O(log n),优于 ArrayList 排序后去重的 O(n log n) 总开销


















