Java基本类型数组无法直接降序排序,需转为包装类型后用Comparator.reverseOrder(),或用Stream流式处理;含null时需用nullsLast,原地降序则需手动实现或第三方库。

Java 数组降序排序不能直接用 Arrays.sort 原生支持,必须配合自定义比较器或包装类型,否则会报错或逻辑翻车。
基本类型数组(如 int[])不能直接降序
因为 Arrays.sort(int[]) 只接受自然升序,且不接受 Comparator;传 Comparator 会编译失败——它只认 Object[] 或泛型集合。
- 错误写法:
Arrays.sort(arr, (a, b) -> b - a)→ 编译报错:no suitable method found for sort(int[],...) - 正确路径:转成
Integer[]再排序,或用Stream(Java 8+) - 性能注意:装箱/拆箱有开销,大数据量时别无脑转包装类
Integer[] 用 Arrays.sort + Comparator.reverseOrder()
这是最常用、最安全的写法,Comparator.reverseOrder() 是 JDK 提供的现成降序比较器,专为实现了 Comparable 的类型设计。
- 示例:
Integer[] arr = {3, 1, 4, 1, 5}; Arrays.sort(arr, Comparator.reverseOrder()); // 结果:[5, 4, 3, 1, 1] - 别手写
(a, b) -> b.compareTo(a),除非你要控制 null 处理逻辑 - 如果数组含
null,reverseOrder()会抛NullPointerException,需改用Comparator.nullsLast(Comparator.reverseOrder())
用 Stream 对基本类型数组一步降序(Java 8+)
适合一次性操作、不介意新建数组的场景,语义清晰,但会额外创建对象和中间流。
立即学习“Java免费学习笔记(深入)”;
- 示例:
int[] arr = {3, 1, 4, 1, 5}; int[] sorted = Arrays.stream(arr) .boxed() .sorted(Collections.reverseOrder()) .mapToInt(Integer::intValue) .toArray(); - 注意
.boxed()和.mapToInt()不可省,漏一个就编译不过 - 比手动转
Integer[]多一次遍历,小数组无所谓,循环内高频调用要警惕 - 不修改原数组,返回新数组——这点和
Arrays.sort行为不同,容易混淆
真正麻烦的是既要降序、又得原地修改、还限于基本类型——这时候只能自己写快排或用第三方库(如 Apache Commons Lang 的 ArrayUtils.reverse() 配合升序后再翻转),但翻转不是严格意义上的“按值降序”,遇到重复元素顺序会变。这个边界情况,很多人一开始根本没想到。









