Comparable 和 Comparator 有什么区别?
查看完整题解
参考回答
直接回答
Comparable 由对象所属的类实现,通过 compareTo 定义自然顺序;Comparator 是外部比较规则,通过 compare 定义某一种排序方式。一个类型通常只有一套自然顺序,但可以有许多 Comparator,例如按年龄、姓名或多个字段组合排序。
讲清原理
比较结果看负数、零、正数,不要求只能返回 -1、0、1。实现时要遵守比较规则,尤其是传递性。不要直接用两个 int 相减比较,因为可能溢出;可用 Integer.compare 或 comparingInt。
排序集合还会利用比较结果判断某些元素是否等价。例如 TreeSet 中 compare 为 0 的两个元素,通常被视为同一个排序位置;如果它与 equals 语义不一致,行为可能令人意外。应明确这种差异,而不是只记住方法名。
例子与易错点
record Person(String name, int age) {}
var people = new java.util.ArrayList<>(java.util.List.of(
new Person("小林", 20), new Person("小周", 18)));
people.sort(java.util.Comparator.comparingInt(Person::age));
System.out.println(people.get(0).name()); // 小周
若年龄相同还需稳定业务顺序,可继续 thenComparing。null 的处理也应明确选择,而不是留给偶然的空指针。
相关题:第 11 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。