Arrays类提供静态工具方法简化数组操作但不改变原数组结构;Arrays.asList()返回固定大小列表,需new ArrayList()包装才支持增删;基本类型数组转List须先转包装类型或用Stream。

Arrays 类不是用来“操作数组”的容器,而是提供一组静态工具方法来简化常见数组任务——它不改变数组本身结构,但能帮你快速完成查找、排序、填充、比较和转换等动作。
如何安全地把数组转成 List?注意 Arrays.asList() 的坑
很多人用 Arrays.asList(arr) 想获得一个可增删的 List,结果调用 add() 或 remove() 时抛出 UnsupportedOperationException。这是因为该方法返回的是 Arrays 内部的固定大小列表(基于原数组),不支持结构性修改。
- 只读场景(如遍历、查找)可以直接用
Arrays.asList(arr) - 需要可变列表时,必须包装一层:
new ArrayList<>(Arrays.asList(arr))
- 基本类型数组(如
int[])传入会变成单元素列表(整个数组作为 Object),必须先转为包装类型数组或改用Stream
排序时为什么 Arrays.sort() 对 int[] 有效,但对 Integer[] 却可能不稳定?
Arrays.sort() 有两套实现逻辑:对基本类型数组使用双轴快排(确定性、高性能);对引用类型数组默认使用 TimSort(稳定、适合部分有序数据)。但 JDK 7+ 中,Arrays.sort(Object[]) 是稳定的,而 Collections.sort() 也是基于同一 TimSort 实现。
- 真正要注意的是:若自定义比较器违反“一致性”(比如返回值随时间变化),即使用了 TimSort 也会出错
- 多维数组排序需手动指定比较逻辑,
Arrays.sort(matrix, Comparator.comparing(a -> a[0]))才能按首列排序 - 并行排序可用
Arrays.parallelSort(),但小数组(
用 Arrays.equals() 和 Arrays.deepEquals() 判等的区别在哪?
普通 Arrays.equals(a, b) 只做一维逐元素比较,遇到嵌套数组(如 int[][])会直接用 == 比较子数组引用,永远返回 false;而 deepEquals() 会递归进入每一层,对任意深度的嵌套数组都有效。
立即学习“Java免费学习笔记(深入)”;
- 对象数组判等依赖元素自身的
equals()方法,若未重写,仍按引用比较 -
Arrays.equals()对null安全(两个null视为相等,null与非null不等) - 性能上,
deepEquals()因递归和类型检查略慢,仅在真有多维需求时才用
填充、复制、查找这些操作,哪些会修改原数组?
除了 Arrays.toString()、Arrays.hashCode()、Arrays.asList() 等纯读取方法外,大部分工具方法都会直接修改传入的原始数组:
-
Arrays.fill(arr, value):原地填充,影响原数组 -
Arrays.copyOf(arr, newLength):返回新数组,原数组不变 -
Arrays.binarySearch():不修改数组,但要求已升序排列,否则结果不可预测 -
Arrays.setAll(arr, generator):用 lambda 填充每个索引,原地修改
最容易忽略的是:所有「copy」开头的方法(如 copyOfRange())都不动原数组,而「fill」「sort」「setAll」全部是 in-place 操作——这点在并发或共享数组场景下必须确认清楚。










