Arrays.sort() 对 int[] 等基本类型数组直接生效,但仅支持原地排序,不返回新数组,也不能用于 Stream 链式调用;因基本类型数组非引用类型,无法自动装箱或参与泛型推导。

Arrays.sort() 对 int[] 等基本类型数组直接生效吗?
不生效。Arrays.sort() 的重载方法中,没有接受 int[]、double[] 等基本类型数组并返回新数组的版本;它确实提供了针对基本类型数组的原地排序重载(如 Arrays.sort(int[])),但**不能用于泛型或 Stream 流式处理,也不能直接返回新数组**——它只修改原数组。
为什么 Arrays.sort(int[]) 能用,但 Arrays.sort(arr).stream() 会报错?
因为 int[] 是基本类型数组,不是 Object[],不能自动装箱为 Integer[],更无法被当作引用类型参与泛型推导。常见错误现象:
-
Arrays.sort(new int[]{3,1,2}).stream()→ 编译失败:voidcannot be dereferenced - 误写成
Arrays.sort((Integer[]) arr)→ClassCastException,基本类型数组无法强转包装类型数组
根本原因:Java 泛型擦除 + 基本类型与引用类型的二分性。别试图绕过类型系统做强制转换。
升序排序 int[] 的三种可靠写法(按推荐顺序)
优先选原地排序(最轻量),需要不可变语义时再考虑复制:
-
原地升序(推荐):
Arrays.sort(arr)—— 直接修改arr,时间复杂度 O(n log n),无额外对象开销 -
复制后排序(需保留原数组):
int[] sorted = arr.clone(); Arrays.sort(sorted); -
用 Stream(仅限 Java 8+,且注意性能):
int[] sorted = Arrays.stream(arr).sorted().toArray();—— 底层会 boxing/unboxing,小数组可读性好,大数组有 GC 和性能损耗
注意:Arrays.stream(int[]) 返回的是 IntStream,不是 Stream,所以 .sorted() 是 IntStream.sorted(),效率尚可,但仍是复制操作。
double[]、long[] 等其他基本类型怎么处理?
全部同理,Arrays.sort() 提供了对应重载:
-
Arrays.sort(double[])、Arrays.sort(long[])、Arrays.sort(char[])等均支持原地升序 - 所有基本类型重载默认都是升序;降序需手动转成包装类型数组(如
Double[])并传入Comparator.reverseOrder(),代价高,慎用 -
boolean[]、byte[]没有内置排序方法,得自己实现或转成int[]处理(例如byte可映射为(int) b & 0xFF)
真正容易被忽略的点是:基本类型数组排序永远不涉及 Comparable 或 Comparator 接口,它们靠 JVM 内置算法实现;一旦你开始想“怎么传自定义比较逻辑”,说明你该用 Integer[] 了。










