TreeSet 通过红黑树实现自动排序,插入、删除、查找均为 O(log n),中序遍历保证有序;依赖 Comparable 或 Comparator 比较元素,不允重复,不维护插入顺序。

TreeSet 在 Java 中通过底层的 红黑树(Red-Black Tree) 实现自动排序,不需要手动调用 sort 方法,插入、删除、查找都天然维持元素的升序(或自定义顺序)。
红黑树本身是自平衡二叉搜索树
红黑树强制满足几个关键性质:节点分红色和黑色、根和叶子(null)为黑色、红色节点子节点必须是黑色、任意节点到其每个叶子路径上黑色节点数相同。这些约束保证了树的高度始终接近 log₂(n),从而让插入、删除、查找操作都在 O(log n) 时间内完成,且中序遍历结果严格有序。
TreeSet 的迭代器(如 for-each 或 iterator())正是按中序遍历红黑树节点,所以返回的元素天然从小到大排列(或按 Comparator 定义的顺序)。
元素比较逻辑由 Comparable 或 Comparator 决定
TreeSet 不依赖对象的内存地址或哈希值,而是依赖元素间的可比较性:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 若元素实现 Comparable 接口(如 String、Integer),TreeSet 调用其
compareTo()方法比较大小; - 若构造时传入 Comparator,则统一使用该比较器;
- 比较结果决定节点在树中的左右位置:小于当前节点 → 左子树,大于 → 右子树,等于 → 被视为重复,不插入(TreeSet 不允许重复)。
插入过程同步维护有序性和红黑性质
每次 add() 时,TreeSet 先按比较结果找到插入位置(类似二叉搜索树),然后将新节点作为红色加入。接着触发可能的 变色与旋转(左旋、右旋),修复因插入破坏的红黑规则。整个过程确保:
- 树仍是一棵二叉搜索树 → 中序遍历保持有序;
- 红黑性质恢复 → 树高度平衡,性能稳定;
- 无重复元素 → 相等判断基于 compare/compareTo,不是 equals。
注意:有序性 ≠ 插入顺序
TreeSet 完全忽略你 add 的先后顺序。例如依次 add(5, 1, 8, 3),内部红黑树构建后,遍历时永远是 1, 3, 5, 8。如果需要按插入顺序访问,应选 LinkedHashSet;若只需排序且允许重复,可用 PriorityQueue 或手动 Collections.sort()。

















