TreeSet 是基于红黑树的有序 Set 实现,支持自然排序(元素需实现 Comparable)和定制排序(传入 Comparator),不允许重复元素,时间复杂度为 O(log n),提供 first/last/floor/ceiling/subSet 等有序操作。

TreeSet 是 Java 中 Set 接口的一个有序实现类,底层基于红黑树(Red-Black Tree),它能自动对元素进行排序——既支持自然排序(要求元素实现 Comparable),也支持定制排序(传入 Comparator)。它不允许多个 null 元素(仅允许一个 null,且仅当使用自定义 Comparator 且该比较器支持 null 时才安全)。
自然排序:元素自身必须可比较
若用无参构造创建 TreeSet,则要求存入的元素类型实现 Comparable 接口,并重写 compareTo() 方法。例如 String、Integer、LocalDate 等都已内置自然序。
- 直接添加
Integer:自动按数值升序排列 - 添加
String:按字典序升序 - 自定义类(如
Person)需实现Comparable<Person>,否则运行时报ClassCastException
定制排序:通过 Comparator 显式指定规则
使用带 Comparator 参数的构造方法,可完全控制排序逻辑,无需修改元素类本身。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 可用 Lambda 表达式:如
new TreeSet<String>(Comparator.reverseOrder())实现降序 - 按字符串长度排序:
new TreeSet<String>((s1, s2) -> Integer.compare(s1.length(), s2.length())) - 多条件排序:先按年龄升序,年龄相同时按姓名降序:
(p1, p2) -> { int c = Integer.compare(p1.age, p2.age); return c != 0 ? c : p2.name.compareTo(p1.name); }
注意红黑树特性带来的行为差异
不同于 HashSet(哈希表,O(1) 查找),TreeSet 的增删查时间复杂度均为 O(log n),但保证有序和范围操作高效。
立即学习“Java免费学习笔记(深入)”;
-
first()/last():快速获取最小/最大元素 -
floor(e)/ceiling(e):找不大于/不小于 e 的最大/最小元素 -
subSet(from, to):获取子区间视图(左闭右开),返回的是原集合的“活”视图,修改会影响原集 - 重复添加相同元素(按
compareTo()或compare()判定为 0)会被忽略,保持 Set 唯一性
常见陷阱与建议
实际使用中容易踩坑,尤其在自定义类和 null 处理上:
- 不要在
compareTo()或Comparator中抛出异常(如空指针),应主动判空或约定 null 排序位置 - 若需支持
null,推荐用Comparator.nullsFirst()或Comparator.nullsLast()包装 - 确保比较逻辑满足「自反性、对称性、传递性、一致性」,否则
TreeSet行为不可预测 - 若仅需去重不关心顺序,优先选
HashSet;若需遍历时有序且频繁做范围查询,TreeSet更合适

















