在 Java 中,Comparator 和 Comparable 都用于对象排序,但它们的设计目的、使用方式和耦合程度不同。
int compareTo(T o);
class Student implements Comparable<Student> {
int age;
public int compareTo(Student o) {
return this.age - o.age;
}
}
使用:
List<Student> list = new ArrayList<>();
Collections.sort(list);
✅ 固定排序规则(自然顺序)
❌ 一旦写好,排序逻辑不易更改
✅ 使用简单(Collections.sort 直接可用)
int compare(T o1, T o2);
Comparator<Student> byAge = (s1, s2) -> s1.age - s2.age;
使用:
list.sort(byAge);
或:
Collections.sort(list, byAge);
✅ 排序规则灵活、可切换
✅ 不修改原类代码
✅ 可同时存在多种排序方式(年龄、成绩等)
| 对比项 | Comparable | Comparator |
|---|---|---|
| 所在位置 | 类内部 | 类外部 |
| 方法 | compareTo |
compare |
| 排序数量 | 一种(自然顺序) | 多种 |
| 耦合度 | 高(改类) | 低(策略模式) |
| 使用场景 | 固定规则 | 灵活规则 |
✅ 用 Comparable
✅ 用 Comparator
list.sort(
Comparator.comparing(Student::getAge)
.thenComparing(Student::getName)
);
如果你愿意,我也可以给你画一张内存/调用关系图,或者结合源码层面讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。