在Java中,Comparator是java.util包下的一个接口,主要用于定义对象的自定义排序规则,它可以让我们在不修改对象本身排序逻辑的前提下,灵活实现多种排序需求,尤其适合对第三方类或者已经定义好的实体类进行排序的场景。

Comparator核心方法说明
Comparator接口中最核心的方法是compare(T o1, T o2),该方法接收两个同类型的对象作为参数,返回值为int类型,排序逻辑完全由这个方法的返回值决定:
- 如果返回值小于0,说明o1应该排在o2前面
- 如果返回值等于0,说明o1和o2顺序相等
- 如果返回值大于0,说明o1应该排在o2后面
基础使用示例:自定义实体类单字段排序
首先我们定义一个简单的用户实体类,包含id和年龄两个属性,后续所有排序示例都基于这个实体类展开。
// 用户实体类
class User {
private int id;
private int age;
public User(int id, int age) {
this.id = id;
this.age = age;
}
public int getId() {
return id;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "User{id=" + id + ", age=" + age + "}";
}
}
如果我们想要按照用户的年龄从小到大排序,可以这样实现Comparator:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComparatorDemo {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User(1, 25));
userList.add(new User(2, 18));
userList.add(new User(3, 30));
// 自定义Comparator实现年龄升序排序
Comparator<User> ageComparator = new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
// 年龄小的排在前面
return o1.getAge() - o2.getAge();
}
};
Collections.sort(userList, ageComparator);
System.out.println("年龄升序排序结果:" + userList);
}
}
运行上述代码后,输出结果为:年龄升序排序结果:[User{id=2, age=18}, User{id=1, age=25}, User{id=3, age=30}],符合我们的排序预期。
进阶场景:多字段排序与逆序排序
1. 逆序排序
如果需要按照年龄从大到小排序,只需要调整compare方法的返回值逻辑,或者直接使用Comparator提供的reverseOrder方法,也可以简化实现:
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
public class ComparatorDemo2 {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User(1, 25));
userList.add(new User(2, 18));
userList.add(new User(3, 30));
// 方式1:手动调整compare逻辑实现降序
Comparator<User> descComparator = new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o2.getAge() - o1.getAge();
}
};
// 方式2:使用Comparator的reverseOrder配合comparing方法(Java 8及以上)
Comparator<User> descComparator2 = Comparator.comparing(User::getAge).reversed();
Collections.sort(userList, descComparator);
System.out.println("年龄降序排序结果:" + userList);
}
}
2. 多字段排序
实际开发中经常会遇到多字段排序的需求,比如先按照年龄升序排序,年龄相同的再按照id升序排序,这时候可以通过Comparator的thenComparing方法实现:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class ComparatorDemo3 {
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User(1, 25));
userList.add(new User(2, 18));
userList.add(new User(3, 25));
userList.add(new User(4, 30));
// 先按年龄升序,年龄相同再按id升序
Comparator<User> multiComparator = Comparator.comparing(User::getAge)
.thenComparing(User::getId);
userList.sort(multiComparator);
System.out.println("多字段排序结果:" + userList);
}
}
运行后输出结果为:多字段排序结果:[User{id=2, age=18}, User{id=1, age=25}, User{id=3, age=25}, User{id=4, age=30}],可以看到年龄为25的两个用户按照id从小到大排列,符合多字段排序的规则。
注意事项
- 如果排序的字段可能为null,需要在compare方法中增加null值处理逻辑,避免空指针异常,比如可以使用
Comparator.nullsFirst或者Comparator.nullsLast来处理null值的排序位置 - Java 8之后Comparator提供了很多静态方法和默认方法,比如comparing、thenComparing、reversed等,可以大幅简化代码编写,建议优先使用这些新特性
- Comparator是函数式接口,只有一个抽象方法compare,所以可以使用Lambda表达式来简化实现,不需要再写匿名内部类的冗余代码
Comparator的设计遵循开闭原则,我们不需要修改实体类本身的代码,只需要通过实现不同的Comparator就可以得到不同的排序规则,非常适合需要多种排序场景的业务开发。
ComparatorJava自定义排序compare方法修改时间:2026-06-26 21:03:32