java对自定义对象数组排序需实现comparable接口定义自然顺序,或传入comparator指定临时规则;arrays.sort()支持两者,可原地排序,注意null处理与classcastexception风险。

Java 对自定义对象数组排序,核心是让对象**可比较**——要么实现 Comparable 接口定义自然顺序,要么提供 Comparator 指定临时规则。数组本身用 Arrays.sort() 即可完成排序。
让类实现 Comparable 接口(适合有唯一合理默认顺序)
在自定义类中重写 compareTo() 方法,返回负数、0 或正数表示“小于”、“等于”或“大于”。Arrays.sort(数组) 会自动按此逻辑排序。
例如,对 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) {
return Integer.compare(this.age, other.age); // 升序
// return Integer.compare(other.age, this.age); // 降序
}
}</person>
使用时直接调用:
Person[] people = {new Person("Alice", 30), new Person("Bob", 25)};
Arrays.sort(people); // 按 age 升序
使用 Comparator 匿名内部类或 Lambda(适合多条件/临时排序)
不修改类本身,更灵活。适用于同一类需按不同字段或组合规则排序的场景。
- 按姓名长度排序(升序):
Arrays.sort(people, (p1, p2) -> Integer.compare(p1.getName().length(), p2.getName().length()));
- 先按年龄升序,年龄相同时按姓名字典序降序:
Arrays.sort(people, (p1, p2) -> {
int ageDiff = Integer.compare(p1.getAge(), p2.getAge());
if (ageDiff != 0) return ageDiff;
return p2.getName().compareTo(p1.getName()); // 注意:p2 在前 → 降序
});
使用方法引用和 Comparator 静态工具(JDK 8+ 更简洁)
利用 Comparator.comparing() 链式调用,代码更清晰、可读性更强。
- 按年龄升序:
Arrays.sort(people, Comparator.comparing(Person::getAge));
- 按姓名长度升序,再按年龄降序:
Arrays.sort(people,
Comparator.comparing((Person p) -> p.getName().length())
.thenComparing(Person::getAge, Comparator.reverseOrder()));
注意点与常见问题
- 数组元素不能为
null,否则Arrays.sort()可能抛NullPointerException;如需支持 null,用Comparator.nullsFirst()或nullsLast() - 若类未实现
Comparable,又没传Comparator,直接调用Arrays.sort(数组)会报ClassCastException - 基本类型数组(如
int[])用Arrays.sort()是原生优化算法;对象数组则基于Timsort(稳定、高效) - 排序是**原地进行**的,不创建新数组,原数组顺序会被改变
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











