Java Comparator 怎么用
在 Java 里,Comparator 是用来定义对象排序规则的一个接口,通常配合 Collections.sort()、List.sort()、Arrays.sort() 或 TreeSet / TreeMap 使用。
下面从最常见用法到进阶用法一步步说明。
一、Comparator 是什么?
Comparator 位于 java.util 包,用来自定义比较规则,不要求对象本身实现 Comparable。
核心方法是:
int compare(T o1, T o2)
返回值含义:
| 返回值 | 含义 |
|---|---|
| < 0 | o1 小于 o2 |
| = 0 | o1 等于 o2 |
| > 0 | o1 大于 o2 |
二、最基础用法(匿名内部类)
示例:按年龄排序
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
import java.util.*;
public class Test {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new Person("Alice", 20));
list.add(new Person("Bob", 18));
list.add(new Person("Tom", 22));
Collections.sort(list, new Comparator() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age; // 升序
}
});
for (Person p : list) {
System.out.println(p.name + " " + p.age);
}
}
}
输出:
Bob 18
Alice 20
Tom 22
三、Lambda 表达式(推荐)
Java 8 以后可以用 Lambda 简化:
list.sort((o1, o2) -> o1.age - o2.age);
或更简洁:
list.sort(Comparator.comparingInt(o -> o.age));
四、Comparator 常用静态方法(非常重要)
1️⃣ 按一个字段排序
Comparator byAge = Comparator.comparingInt(p -> p.age);
list.sort(byAge);
2️⃣ 倒序排序
list.sort(Comparator.comparingInt(Person::getAge).reversed());
3️⃣ 多条件排序(先年龄,再姓名)
list.sort(
Comparator.comparingInt(Person::getAge)
.thenComparing(Person::getName)
);
4️⃣ 处理 null 值
Comparator comparator =
Comparator.nullsFirst(Comparator.comparing(Person::getName));
五、与 Comparable 的区别
| 对比项 | Comparable | Comparator |
|---|---|---|
| 包 | java.lang | java.util |
| 方法 | compareTo | compare |
| 是否修改原类 | ✅ 需要 | ❌ 不需要 |
| 排序规则 | 默认排序 | 自定义多种排序 |
✅ 一般建议:
- 类本身有“自然顺序” → 用
Comparable - 需要多种排序方式 → 用
Comparator
六、TreeSet / TreeMap 中使用 Comparator
TreeSet set = new TreeSet<>(
Comparator.comparingInt(Person::getAge)
);
七、完整示例(推荐写法)
list.sort(
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName)
.reversed()
);
如果你愿意,我可以:
- 用 面试题角度讲 Comparator
- 对比 compareTo vs compare 的坑
- 给你 真实业务排序案例
你想看哪种?