comparator优先级更高:arrays.sort(a, c)、collections.sort(list, c)、treeset(c)、treemap(c)显式传入时完全忽略comparable;而arrays.sort(a)、collections.sort(list)、treeset()、treemap()无参时强制要求实现comparable。

Comparator 优先级更高。
当一个实体类同时实现了 Comparable 接口(定义了自然排序),又在排序方法中显式传入了 Comparator 实例时,Java 的标准排序工具会完全忽略 Comparable.compareTo(),只按 Comparator.compare() 的逻辑执行。
哪些地方会触发这个“优先级”行为?
-
Arrays.sort(T[] a, Comparator super T> c) -
Collections.sort(List<t> list, Comparator super T> c)</t> -
TreeSet<e>(Comparator super E> comparator)</e> -
TreeMap<k>(Comparator super K> comparator)</k>
这些 API 明确接收 Comparator 参数,一旦传入,就绕过元素自身的 Comparable 实现。
例如:
哪些地方不看 Comparator,只认 Comparable?
-
Arrays.sort(T[] a)(无参重载) -
Collections.sort(List<t> list)</t>(无参重载) -
TreeSet<e>()</e>(无参构造) -
TreeMap<k>()</k>(无参构造)
这些方法要求元素必须实现 Comparable,否则运行时报 ClassCastException。
注意:不是“优先级低”,而是根本没机会调用 Comparator —— 因为它压根没被传进来。
容易踩坑的典型错误
- 把实现了
Comparable的类放进TreeSet,又额外传一个逻辑冲突的Comparator
→ 不报错,但排序结果与预期不符,且TreeSet.contains()、remove()等行为可能异常(比如找不到明明存在的对象) - 在
compareTo()中返回0但equals()返回false,再配合Comparator使用,会让TreeSet/TreeMap出现去重或查找失效问题
关键原则:
- Comparator 是“覆盖式”的:传了,就只用它
- Comparable 是“兜底式”的:没传 Comparator,才强制依赖它
- 两者共存不冲突,但混用时务必确保语义一致,尤其涉及 `equals()` 和 `compareTo()`/`compare()` 的等价性
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











