Java中对对象数组自定义排序需传入Comparator实现,推荐Lambda表达式或Comparator.comparing链式调用,注意避免整数溢出、空指针及违反比较器契约。

Java 中使用 Arrays.sort 对对象数组按自定义规则排序,核心是传入一个实现了 Comparator 接口的比较器。只要对象类型不是基本类型(如 int[]),就必须提供比较逻辑。
用 Lambda 表达式写比较器(推荐,简洁)
Java 8+ 支持 Lambda,写法最直观。假设有一个 Person 类:
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}按年龄升序排序:
Person[] people = {new Person("Alice", 30), new Person("Bob", 25)};
Arrays.sort(people, (p1, p2) -> p1.age - p2.age);按姓名字典序降序(注意大小写):
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Arrays.sort(people, (p1, p2) -> p2.name.compareTo(p1.name));
多个条件组合(先按年龄升序,年龄相同时按姓名降序):
Arrays.sort(people, (p1, p2) -> {
int ageCmp = Integer.compare(p1.age, p2.age);
if (ageCmp != 0) return ageCmp;
return p2.name.compareTo(p1.name);
});用 Comparator.comparing 链式调用(更清晰、可读性强)
适合多级排序,避免手写 if 判断:
- 按年龄升序:
Arrays.sort(people, Comparator.comparing(p -> p.age)); - 按姓名降序:
Arrays.sort(people, Comparator.comparing((Person p) -> p.name).reversed()); - 先年龄升序,再姓名降序:
Arrays.sort(people, Comparator.comparing((Person p) -> p.age).thenComparing(p -> p.name, Comparator.reverseOrder()));
实现 Comparator 接口(兼容老版本或逻辑复杂时)
单独定义一个类或匿名内部类:
// 匿名内部类
Arrays.sort(people, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
if (p1.age != p2.age) {
return Integer.compare(p1.age, p2.age);
}
return p1.name.compareTo(p2.name);
}
});或者定义独立比较器类:
class AgeThenNameComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
int c1 = Integer.compare(p1.age, p2.age);
return c1 != 0 ? c1 : p1.name.compareTo(p2.name);
}
}
// 使用
Arrays.sort(people, new AgeThenNameComparator());注意事项和常见坑
-
不要在 compare 方法中直接返回
p1.age - p2.age处理大整数:可能溢出导致结果错误;应使用Integer.compare(p1.age, p2.age) -
数组必须是非 null 的引用类型数组:不能对
null数组调用sort,否则抛NullPointerException -
比较器不能返回非 int 值,也不能违反自反性、传递性:比如
compare(a,a)必须返回 0;若compare(a,b)>0且compare(b,c)>0,则compare(a,c)也应 >0 -
原始类型数组(如
int[])不支持 Comparator:它们有专用重载方法(Arrays.sort(int[])),但无法自定义逻辑;如需自定义,得转成Integer[]

















