
Arrays.sort 默认只对基本类型数组和实现了 Comparable 的对象数组生效;直接传入自定义类数组且未实现比较逻辑,会抛 ClassCastException 或 IllegalArgumentException。
Arrays.sort 对 int[] 和 Integer[] 的行为差异
看似一样,实则底层完全不同:对 int[] 调用的是专门的双轴快排(JDK 7+),而 Integer[] 走的是 TimSort(稳定排序)。这意味着:
-
int[]不能用Comparator,传进去会编译报错 —— 基本类型数组不接受第三个参数 -
Integer[]可以用Arrays.sort(arr, Comparator.reverseOrder()),但注意装箱开销,大数据量时比int[]慢 2–3 倍 - 混用容易踩坑:把
int[]强转成Integer[]会触发NullPointerException(自动拆箱时遇到 null)
自定义类排序必须显式提供 Comparator 或实现 Comparable
比如有个 Person 类,字段是 name 和 age,想按年龄升序排:
- 不实现
Comparable,也不传Comparator→ 运行时报ClassCastException: Person cannot be cast to java.lang.Comparable - 推荐用 lambda 写法:
Arrays.sort(people, (a, b) -> Integer.compare(a.age, b.age)),比匿名类简洁,也避免return a.age - b.age的整数溢出风险 - 如果要多级排序(先按 age,age 相同再按 name),写成
(a, b) -> a.age != b.age ? Integer.compare(a.age, b.age) : a.name.compareTo(b.name)
Arrays.sort 是原地排序,但别误以为它返回新数组
它没有返回值(void),所有修改直接作用于原数组。常见错误:
立即学习“Java免费学习笔记(深入)”;
- 写成
String[] sorted = Arrays.sort(arr);→ 编译失败,因为返回类型是void - 想保留原始顺序?必须先复制:
String[] copy = arr.clone(); Arrays.sort(copy);,用Arrays.copyOf()也行,但别用new String[arr.length]后逐个赋值,效率低 - 对引用类型数组排序,只是重排引用地址,原对象本身没变 —— 所以修改排序后数组里的某个对象字段,原始数组里对应位置的对象也会同步变化
最常被忽略的一点:Arrays.sort 对 null 元素极其敏感。哪怕只有一个 null 在 String[] 里,用默认排序就会抛 NullPointerException;必须用 Comparator.nullsFirst() 或手动过滤掉 null 再排。









