Java中Arrays.sort()支持自定义排序,核心是传入Comparator:可用匿名内部类、Lambda表达式(推荐)、或实现接口复用;需满足比较器三性质,注意null处理与不可变性,底层为稳定高效的双轴快排。

Java中Arrays.sort()方法支持对对象数组按自定义规则排序,核心是传入一个Comparator实现,告诉JVM“两个对象谁在前、谁在后”。
使用匿名内部类定义比较逻辑
适用于简单、一次性使用的排序规则。比如对Person对象按年龄升序排列:
Person[] people = {new Person("张三", 25), new Person("李四", 22)};
Arrays.sort(people, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge()); // 升序
}
});注意:Integer.compare()比直接用p1.getAge() - p2.getAge()更安全,避免整数溢出问题。
使用Lambda表达式简化写法(推荐)
Java 8+ 支持Lambda,代码更简洁清晰:
立即学习“Java免费学习笔记(深入)”;
- 按年龄升序:
Arrays.sort(people, (p1, p2) -> Integer.compare(p1.getAge(), p2.getAge())); - 按姓名降序:
Arrays.sort(people, (p1, p2) -> p2.getName().compareTo(p1.getName())); - 多条件排序(先按年龄升序,年龄相同时按姓名降序):
Arrays.sort(people, (p1, p2) -> {<br> int ageCmp = Integer.compare(p1.getAge(), p2.getAge());<br> if (ageCmp != 0) return ageCmp;<br> return p2.getName().compareTo(p1.getName());<br> });
实现Comparator接口复用比较器
当某类排序逻辑需在多处使用时,可单独定义一个类或静态内部类:
public class AgeAscComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge());
}
}
// 使用:
Arrays.sort(people, new AgeAscComparator());也可定义为public static final字段,便于直接引用:
public class Person {
public static final Comparator<Person> BY_AGE_ASC =
(p1, p2) -> Integer.compare(p1.getAge(), p2.getAge());
}
// 调用:
Arrays.sort(people, Person.BY_AGE_ASC);注意事项与常见陷阱
确保比较器满足自反性、对称性、传递性,否则sort()行为未定义;尤其注意null值处理:
- 若对象字段可能为
null,用Objects.compare(a, b, Comparator.nullsLast(String::compareTo))等工具方法 - 不要在
compare()中修改对象状态,只做读取判断 -
Arrays.sort()对对象数组使用的是**双轴快排(Timsort变种)**,稳定且高效,但不改变原数组引用,只重排元素位置


















