arrays.fill不能直接填充二维数组全部元素,因其仅作用于外层数组,将同一引用赋给每行,导致修改一行影响所有行;且传入基本类型值会编译失败,因外层元素类型为int[]而非int。

Arrays.fill 不能直接填充多维数组的全部元素,它只适用于一维数组(即数组的每个元素是基本类型或对象引用)。对二维或更高维数组调用 Arrays.fill,只会填充“外层数组”的引用,而非深层的值。
为什么 Arrays.fill(arr, val) 对二维数组无效?
Java 中的二维数组本质上是一维数组的数组。例如:
int[][] matrix = new int[3][4];
这里 matrix 是一个长度为 3 的 int[] 引用数组。执行 Arrays.fill(matrix, new int[]{1,1,1,1}) 只会让所有行引用同一个一维数组,导致修改某一行会影响其他行;而 Arrays.fill(matrix, 0) 甚至会编译失败——因为 matrix 的元素类型是 int[],不是基本类型 int,无法用 int 值填充。
正确填充二维数组的常用方法
-
嵌套循环逐层填充:最直观、兼容性最好
for (int i = 0; i -
使用 Arrays.setAll 配合 lambda(Java 8+):
Arrays.setAll(matrix, i -> { int[] row = new int[matrix[i].length]; Arrays.fill(row, 7); return row; }); -
借助 IntStream(仅限基本类型,如 int[][]):
IntStream.range(0, matrix.length) .forEach(i -> Arrays.fill(matrix[i], -1));
填充不规则二维数组(每行长度不同)
只要每行已初始化,仍可对各行单独调用 Arrays.fill:
int[][] jagged = {
{1},
{2, 3},
{4, 5, 6}
};
for (int i = 0; i
注意判空,避免 NullPointerException。
替代方案:用 Arrays.deepFill(Java 19+)
从 Java 19 开始,Arrays 类新增了 deepFill 方法,支持递归填充多维数组:
int[][] grid = new int[2][3]; Arrays.deepFill(grid, 42); // ✅ 全部元素变为 42
该方法适用于任意维度的数组(如 int[][][]),但要求所有子数组已创建(不能为 null)。低于 Java 19 的版本不可用。











