在Java中,Arrays.sort方法对引用类型数组排序时,默认会按照对象的自然顺序排序,如果对象没有实现Comparable接口或者需要自定义排序规则,就需要传入自定义比较器来指定排序逻辑。自定义比较器主要通过实现Comparator接口或者使用lambda表达式来完成,下面详细介绍具体的写法。

基于Comparator接口的自定义比较器写法
Comparator是Java提供的一个函数式接口,里面定义了compare方法,我们需要实现这个方法来指定两个对象的比较规则。compare方法接收两个参数o1和o2,返回负整数、零或正整数,分别表示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.Arrays;
import java.util.Comparator;
public class ArraySortDemo {
public static void main(String[] args) {
// 创建引用类型数组
User[] users = new User[]{
new User(1, 25),
new User(2, 18),
new User(3, 30)
};
// 定义自定义比较器,按照年龄升序排序
Comparator<User> ageComparator = new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
// 年龄小的排在前面
return o1.getAge() - o2.getAge();
}
};
// 使用Arrays.sort传入数组和自定义比较器
Arrays.sort(users, ageComparator);
// 输出排序后的结果
for (User user : users) {
System.out.println(user);
}
}
}
上述代码的输出结果会是User{id=2, age=18}、User{id=1, age=25}、User{id=3, age=30},符合年龄升序的预期。
使用lambda表达式简化比较器写法
因为Comparator是函数式接口,只有一个抽象方法,所以可以使用lambda表达式来简化比较器的定义,不需要再写匿名内部类的冗余代码。
还是以上面的User数组为例,按照年龄升序排序的lambda写法如下:
import java.util.Arrays;
public class ArraySortLambdaDemo {
public static void main(String[] args) {
User[] users = new User[]{
new User(1, 25),
new User(2, 18),
new User(3, 30)
};
// 使用lambda表达式定义比较器,按照年龄升序排序
Arrays.sort(users, (o1, o2) -> o1.getAge() - o2.getAge());
for (User user : users) {
System.out.println(user);
}
}
}
如果需要按照年龄降序排序,只需要调整compare方法的返回值逻辑即可,lambda写法下可以改为o2.getAge() - o1.getAge()。
多条件排序的比较器写法
实际业务中经常需要多条件排序,比如先按照年龄升序,年龄相同再按照id升序,这时候可以在compare方法中依次判断多个条件。
import java.util.Arrays;
public class MultiConditionSortDemo {
public static void main(String[] args) {
User[] users = new User[]{
new User(1, 25),
new User(2, 18),
new User(3, 25),
new User(4, 30)
};
// 多条件排序:先按年龄升序,年龄相同按id升序
Arrays.sort(users, (o1, o2) -> {
// 先比较年龄
int ageCompare = o1.getAge() - o2.getAge();
if (ageCompare != 0) {
return ageCompare;
}
// 年龄相同再比较id
return o1.getId() - o2.getId();
});
for (User user : users) {
System.out.println(user);
}
}
}
上述代码的输出结果会是User{id=2, age=18}、User{id=1, age=25}、User{id=3, age=25}、User{id=4, age=30},符合多条件排序的预期。
自定义比较器的注意事项
- compare方法的实现需要满足自反性、对称性和传递性,否则排序结果可能会出现异常。
- 如果数组中存在null元素,自定义比较器需要处理空值情况,否则会抛出NullPointerException。比如可以在比较器中先判断null,指定null元素排在数组的前面或者后面。
- 对于Integer、String等已经实现Comparable接口的引用类型,也可以传入自定义比较器覆盖默认的自然排序规则。
如果需要处理空值的场景,比较器可以这样写:
import java.util.Arrays;
public class NullHandleSortDemo {
public static void main(String[] args) {
User[] users = new User[]{
new User(1, 25),
null,
new User(2, 18),
null
};
// 处理空值的比较器,null元素排在前面
Arrays.sort(users, (o1, o2) -> {
if (o1 == null && o2 == null) {
return 0;
}
if (o1 == null) {
return -1; // o1是null,排在前面
}
if (o2 == null) {
return 1; // o2是null,排在后面
}
return o1.getAge() - o2.getAge();
});
for (User user : users) {
System.out.println(user);
}
}
}
JavaArrays.sort自定义比较器引用类型数组修改时间:2026-07-23 15:51:36