comparator适用于不修改原类、需多种排序规则或类不可修改的场景,因其是外部可复用的比较逻辑,支持多字段、多级、逆序及空值安全排序,常用lambda、comparator静态方法实现。

Java 中实现对象排序,最常用且灵活的方式是让类实现 Comparable 接口(自然排序),或创建独立的 Comparator 实现类/匿名类/lambda 表达式(定制排序)。当你**不想修改原类、需要多种排序规则、或类本身不可修改**时,Comparator 就是首选。
为什么用 Comparator 而不是 Comparable?
Comparable 要求类自身定义“唯一自然顺序”(比如 String 按字典序、Integer 按数值大小),一个类只能实现一次。而 Comparator 是外部的、可复用的比较逻辑,支持同一类对象按姓名、年龄、分数、创建时间等不同字段多次排序。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
如何实现 Comparator 接口?
只需实现 int compare(T o1, T o2) 方法:返回负数表示 o1 在前,正数表示 o2 在前,0 表示相等。常见写法有三种:
-
独立类方式:适合复杂、复用率高的比较逻辑
// 例如按 Student 的 age 升序class AgeComparator implements Comparator<student> {<br> public int compare(Student s1, Student s2) {<br> return Integer.compare(s1.getAge(), s2.getAge()); // 推荐用 Integer.compare 避免溢出<br> }<br> }</student> -
匿名内部类:适合一次性、简单逻辑
Collections.sort(students, new Comparator<student>() {<br> public int compare(Student s1, Student s2) {<br> return s1.getName().compareTo(s2.getName());<br> }<br> });</student> -
Lambda 表达式(推荐,JDK 8+):简洁清晰
Collections.sort(students, (s1, s2) -> s1.getScore() - s2.getScore()); // 升序<br> // 或更安全写法:<br> Collections.sort(students, Comparator.comparingInt(Student::getScore));
常用技巧与注意事项
-
链式比较(多级排序):先按年龄,年龄相同时按姓名
Comparator<student> cmp = Comparator.comparingInt(Student::getAge)<br> .thenComparing(Student::getName);</student>
-
逆序:用
reversed()Comparator.comparing(Student::getName).reversed() -
空值安全:用
Comparator.nullsFirst()或nullsLast()Comparator.comparing(Student::getNickname, Comparator.nullsLast(String::compareTo)) -
避免直接减法溢出:对 int/long 字段,别写
s1.getAge() - s2.getAge(),改用Integer.compare()或Comparator.comparingInt()
配合集合排序的实际调用
Comparator 主要用于以下场景:
-
Collections.sort(list, comparator)—— 对 ArrayList 等 List 原地排序 -
list.stream().sorted(comparator).collect(Collectors.toList())—— 流式处理,返回新列表 -
TreeSet<student> set = new TreeSet(comparator)</student>—— 构建有序集合 -
Arrays.sort(array, comparator)—— 对对象数组排序
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










