在 Java 中,Comparator 是一个函数式接口,用于定义对象之间的比较规则。
之所以要“重写”(更准确说是实现其抽象方法),核心原因是:
Java 不知道你希望按什么规则比较两个对象,必须由你指定。
下面从几个角度解释。
Comparator 的本质Comparator 接口中最重要的一个方法是:
int compare(T o1, T o2);
Java 本身无法自动判断:
所以你必须重写(实现)这个方法,告诉 Java 比较逻辑。
例如:
class Person {
String name;
int age;
}
Java 并不知道:
age 小的是“小”name 字典序小的是“小”因此:
Collections.sort(list); // ❌ 编译错误
必须提供比较规则。
Comparator 的常见方式Comparator<Person> comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}
};
Comparator<Person> comparator = (p1, p2) -> p1.getAge() - p2.getAge();
Comparator<Person> comparator = Comparator.comparingInt(Person::getAge);
Comparator vs Comparable| 对比项 | Comparator | Comparable |
|---|---|---|
| 所在位置 | 外部比较器 | 对象自身实现 |
| 方法 | compare(o1, o2) |
compareTo(o) |
| 是否必须重写 | ✅ 必须 | ✅ 必须 |
| 灵活性 | 高(可多种排序规则) | 低(只能一种自然顺序) |
| 典型用途 | 排序策略 | 定义“自然顺序” |
例如:
list.sort(Comparator.comparing(Person::getName));
其实:
Comparator.comparing(...) 内部已经帮你重写了 comparecompare
Comparator需要重写,是因为比较规则是业务相关的,Java 无法自动推断,必须由开发者定义。
如果你愿意,我也可以:
Comparator免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。