要排序自定义对象数组,需提供比较逻辑:一是实现comparable接口定义自然排序,二是传入comparator实现灵活排序;前者适用于主排序规则,后者支持多条件、临时及空值安全排序。

使用 Arrays.sort() 对自定义对象数组排序,核心是告诉 Java “怎么比较两个对象的大小”。Java 本身不知道你的类(比如 Person、Book)谁大谁小,所以你需要提供比较逻辑——通过实现 Comparable 接口(自然排序),或传入一个 Comparator(临时排序)。
方式一:让类实现 Comparable 接口(推荐用于主排序规则)
在你的自定义类中,重写 compareTo() 方法,定义“默认怎么比”。
例如,对 Student 类按年龄升序排序:
public class Student implements Comparable<student> {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student other) {
return Integer.compare(this.age, other.age); // 升序:小的在前
// 若想降序,可写:return Integer.compare(other.age, this.age);
}
}</student>
然后直接调用:
Student[] students = {new Student("Alice", 20), new Student("Bob", 18)};
Arrays.sort(students); // ✅ 自动按 age 升序
方式二:使用 Comparator 匿名内部类或 Lambda(灵活,适合多条件/临时排序)
不修改原类,运行时指定规则。适用于同一类需按不同字段排序的场景(如先按年龄、再按姓名)。
- 按姓名长度升序(Java 8+ 推荐 Lambda):
Arrays.sort(students, (a, b) -> Integer.compare(a.name.length(), b.name.length()));
- 按年龄降序,年龄相同时按姓名字典序升序:
Arrays.sort(students, (a, b) -> {
int ageDiff = Integer.compare(b.age, a.age); // 降序:b 在前表示 b > a
if (ageDiff != 0) return ageDiff;
return a.name.compareTo(b.name); // 升序
});
- 更简洁写法(使用 Comparator 静态方法):
Arrays.sort(students,
Comparator.comparingInt((Student s) -> s.age).reversed()
.thenComparing(s -> s.name));
注意事项和常见问题
-
空值安全:如果数组中可能有
null,直接排序会抛NullPointerException。可用Comparator.nullsFirst()或nullsLast()处理,例如:Arrays.sort(students, Comparator.nullsLast(Comparator.comparing(s -> s.name))); -
基本类型数组不能用 Comparable:像
int[]、double[]直接调Arrays.sort(arr)即可,它们有专用重载方法,不走泛型逻辑。 -
引用类型数组必须非 null,且元素可比较:若元素为
null且没做空值处理,或类没实现Comparable又没传Comparator,会报ClassCastException或NullPointerException。 -
稳定性:Java 的
Arrays.sort()对对象数组使用的是归并排序(Timsort 的变种),是稳定排序——相等元素的相对顺序不会改变。
总结一句话
要排序自定义对象数组,要么让类自己“学会比较”(实现 Comparable),要么现场给一个“比较方案”(传 Comparator)。Lambda 和 Comparator 工具方法让后者越来越简洁,日常开发中更常用。










