用 Java 的 Comparator,核心原因可以概括为一句话:
把“比较规则”从对象本身中解耦出来,让排序更灵活、可扩展、可复用。
下面从几个角度说清楚为什么要用 Comparator,而不是只用别的方式。
如果一个类只实现 Comparable,那它就只能有一种自然排序。
class Student implements Comparable<Student> {
int age;
public int compareTo(Student o) {
return Integer.compare(this.age, o.age);
}
}
问题来了:
而 Comparator 可以随时定义不同规则:
Comparator<Student> byName = (a, b) -> a.name.compareTo(b.name);
Comparator<Student> byScore = (a, b) -> Integer.compare(b.score, a.score);
✅ 一个类,多种排序方式
很多时候:
// String 你不能改,但你可以:
List<String> list = ...;
list.sort(Comparator.reverseOrder());
✅ 不改动源码,就能自定义排序
Comparator 提供了一堆好用的方法:
list.sort(
Comparator
.comparing(Student::getScore)
.thenComparing(Student::getAge)
);
这用 Comparable 写会非常痛苦。
✅ 链式、可读性高、表达力强
很多 API 都直接接收 Comparator:
List.sort(Comparator)
Stream.sorted(Comparator)
TreeMap / TreeSet 构造器
Collections.sort(...)
✅ 标准、统一、官方推荐方式
| 对比点 | Comparable | Comparator |
|---|---|---|
| 位置 | 写在类里 | 写在类外 |
| 数量 | 只能一种 | 任意多种 |
| 修改类 | 需要 | 不需要 |
| 使用场景 | 自然排序 | 灵活排序 |
Integer、String)那用 Comparable 就够了。
用
Comparator,是因为现实中的“排序规则”从来都不止一种。
如果你愿意,我也可以给你一个**真实业务场景(比如订单、用户、成绩)**来对比 Comparable 和 Comparator 的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。