Java中用Arrays.sort对对象数组排序,关键在于让类实现Comparable接口并重写compareTo方法。例如Person类实现Comparable<Person>,按年龄升序、同龄时按姓名字典序;数组直接调用Arrays.sort(people)即可排序,无需额外比较器;注意泛型匹配、返回值语义、null处理及与Comparator的区别。

Java中用 Arrays.sort 对对象数组排序,关键在于让类实现 Comparable 接口并重写 compareTo 方法。这样数组元素自带比较逻辑,Arrays.sort 就能直接排序,无需额外传比较器。
1. 类必须实现 Comparable<T>
让目标类(比如 Person)实现 Comparable<Person>,表示它“知道自己怎么比”:
// 示例:按年龄升序,年龄相同时按姓名字典序
public class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
int ageDiff = Integer.compare(this.age, other.age);
if (ageDiff != 0) {
return ageDiff; // 年龄不同,按年龄排
}
return this.name.compareTo(other.name); // 年龄相同,按姓名排
}
// getter 等略
}
2. 创建对象数组后直接调用 Arrays.sort
只要元素类型实现了 Comparable,Arrays.sort 就能识别并使用其 compareTo 方法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 传入对象数组引用即可,不用写 lambda 或新比较器
- 默认升序;如需降序,可配合
Collections.reverseOrder()(但注意:要传Comparator,此时就不再依赖Comparable)
// 使用示例
Person[] people = {
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 30)
};
Arrays.sort(people); // ✅ 直接排序,按 compareTo 定义的规则
// 输出:Bob(25), Alice(30), Charlie(30)
for (Person p : people) {
System.out.println(p.getName() + "(" + p.getAge() + ")");
}
3. 注意事项和常见问题
-
泛型类型必须匹配:实现的是
Comparable<Person>,就不能拿Person数组去和String比较 - compareTo 返回值含义要明确:负数表示“小于”,0 表示“等于”,正数表示“大于”。别反着写或只返回 1/-1
-
null 值会抛 NullPointerException:如果数组里有
null,排序时会报错。确保数据非空,或在compareTo中提前判空处理(但需符合自然顺序约定) -
不能用于基本类型数组:
Arrays.sort(int[])走的是专用重载,跟Comparable无关
4. 和 Comparator 的区别
Comparable 是“类自己定义默认怎么比”,一个类一般只实现一次;Comparator 是“外部定义临时怎么比”,可以多个、灵活切换。如果已有类没实现 Comparable,或想换一种排序方式(比如按姓名倒序),就该用 Comparator 配合 Arrays.sort(arr, comparator)。

















