Java中对对象数组自定义排序需用Comparator配合Arrays.sort(),因对象类型无默认比较逻辑;Lambda写法简洁安全,支持多条件、null值处理及升/降序控制。

Java 中对对象数组做自定义排序,核心就是用 Comparator 配合 Arrays.sort()。它不改原数组类型,但会直接修改原数组顺序;要求必须是引用类型数组(如 String[]、Person[]、Integer[]),不能是 int[] 这类基本类型。
为什么必须用 Comparator?
因为 Java 不知道你的自定义类(比如 Book 或 Order)谁该排在前。默认调用 Arrays.sort(people) 会报 ClassCastException——除非这个类自己实现了 Comparable。而 Comparator 是外部定义的比较规则,更灵活,不用动原有类。
它的 compare(T o1, T o2) 方法返回值含义明确:
- 负数:o1 排在 o2 前面
- 0:两个元素视为相等
- 正数:o1 排在 o2 后面
Lambda 写法最常用也最简洁
Java 8 起推荐用 Lambda 表达式,省去匿名内部类的模板代码。例如按年龄升序:
立即学习“Java免费学习笔记(深入)”;
Arrays.sort(people, (p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));
注意别直接写 p1.getAge() - p2.getAge(),整数溢出时结果会错;Integer.compare() 是安全写法。
降序就把参数换位:(p1, p2) -> Integer.compare(p2.getAge(), p1.getAge()),或者用 Comparator.comparingInt(Person::getAge).reversed()。
多条件排序要分层判断
先按主条件比,不等就返回;相等再比次条件。比如“先按城市升序,城市相同时按薪资降序”:
Arrays.sort(employees, (e1, e2) -> { int cityCmp = e1.getCity().compareTo(e2.getCity()); if (cityCmp != 0) return cityCmp; return Integer.compare(e2.getSalary(), e1.getSalary()); // 降序});
也可以链式调用:Comparator.comparing(Employee::getCity).thenComparingInt(Employee::getSalary).reversed(),但要注意 reversed() 会影响整个链,不是只逆第二级。
null 值处理不能忽略
如果字段可能为 null,直接调用 .compareTo() 会抛 NullPointerException。安全做法是用 Comparator.nullsFirst() 或 Comparator.nullsLast() 包装:
Arrays.sort(people, Comparator.nullsLast(Comparator.comparing(Person::getName)));
这表示 null 名字排在最后,非空名字按字典序升序。若想 null 排最前,换成 nullsFirst 即可。


















