在 Java 中,Comparator 需要(或说“通常会”)重写,是因为它本质上是一个“比较规则接口”,而 Java 不可能为你写好所有对象的比较逻辑。
下面从「为什么存在」「为什么重写」「不重写会怎样」「常见重写方式」四个角度说明。
Comparator<T> 是一个函数式接口,只定义一个核心方法:
int compare(T o1, T o2);
它的作用是:
Collections.sort、List.sort、Stream.sorted 等)例如有一个 User 类:
class User {
String name;
int age;
}
年龄大的算大?名字字典序算大?分数高的算大?
Java 不知道,所以必须你来决定比较规则 → 重写 compare。
Comparator<User> byAge = new Comparator<User>() {
@Override
public int compare(User u1, User u2) {
return u1.age - u2.age;
}
};
Comparator 的好处是:不修改原类
Comparator<User> byName = (u1, u2) -> u1.name.compareTo(u2.name);
Comparator<User> byAge = (u1, u2) -> u1.age - u2.age;
你可以随时切换排序规则,而不动 User 类。
Object 没有比较能力sortComparable 时,必须提供 ComparatorList<User> list = ...;
list.sort(); // 编译错误
或者:
Collections.sort(list); // 要求 User 实现 Comparable
如果不提供 Comparator 或 Comparable:
Java 根本不知道怎么排
| 对比 | Comparator | Comparable |
|---|---|---|
| 位置 | 外部定义 | 类内部实现 |
| 方法 | compare(o1, o2) |
compareTo(o) |
| 灵活性 | ✅ 多种规则 | ❌ 只有一种 |
| 是否改类 | ❌ 不改 | ✅ 改原类 |
结论:
ComparableComparator(重写)list.sort((a, b) -> a.age - b.age);
list.sort(Comparator.comparing(User::getAge));
list.sort(
Comparator.comparing(User::getAge)
.thenComparing(User::getName)
);
Comparator 要重写,是因为“比较规则由使用场景决定,而不是对象本身决定”。
如果你愿意,我也可以帮你画一张「Comparator 执行流程图」或结合你当前代码讲具体该怎么写。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。