java对象数组排序需显式定义比较规则,通过comparator或comparable实现;否则按内存地址排序无业务意义,且null元素会抛异常,须用nullsfirst/nullslast处理。

Java 对象数组排序,核心不在调用 Arrays.sort() 这一行代码,而在于如何让 JVM 明确知道“两个对象谁该排在前面”。它不自动猜逻辑,必须靠 Comparator 或 Comparable 显式定义比较规则。
对象数组必须传 Comparator 才能排序
String[]、Person[] 等引用类型数组,如果不传比较器,Arrays.sort(arr) 会按内存地址排——结果无业务意义,甚至抛 ClassCastException。
- 升序最简写法:
Arrays.sort(people, (a, b) -> a.getAge() - b.getAge())(仅限 int 字段且确认无溢出) - 更安全写法:
Arrays.sort(people, Comparator.comparingInt(Person::getAge)) - 降序写法:
Arrays.sort(people, Comparator.comparingInt(Person::getAge).reversed())或(a, b) -> b.getAge() - a.getAge() - 字符串按长度排:
Arrays.sort(words, Comparator.comparing(String::length))
多字段排序支持链式组合
现实业务中很少只按一个字段排序。比如“先按部门升序,部门相同时按薪资降序”,可直接链式表达,无需嵌套判断。
Arrays.sort(employees, Comparator.comparing(Employee::getDept).thenComparing(Employee::getSalary).reversed())- 注意:.reversed() 作用于整个链,若只想某字段降序,应拆开写:
comparing(...).reversed().thenComparing(...) - 字段可能为 null?用
Comparator.nullsLast(Comparator.comparing(...))避免空指针
null 元素必须主动处理
默认情况下,只要数组里有一个 null,Arrays.sort() 就会立即抛 NullPointerException,哪怕其他元素都正常。
- 让 null 排末尾:
Comparator.nullsLast(Comparator.naturalOrder()) - 让 null 排开头:
Comparator.nullsFirst(Comparator.naturalOrder()) - 对自定义字段比较时,别直接写
a.getName().compareTo(b.getName()),应改用Comparator.comparing(Person::getName, Comparator.nullsLast(String::compareTo))
原地修改 + 范围排序很实用
Arrays.sort() 永远修改原数组,不返回新数组。如果需要保留原始顺序,得先复制一份;如果只需排其中一段,可用三参数重载。
- 复制再排:
Person[] sorted = Arrays.copyOf(people, people.length); Arrays.sort(sorted, comp); - 只排索引 2 到 5(含 2,不含 5):
Arrays.sort(people, 2, 5, comp) - 基本类型(如 int[])也支持范围排序,但不能传 Comparator
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











