Arrays.fill()不能直接初始化二维数组,因其仅支持一维数组填充;直接调用Arrays.fill(matrix, value)会导致所有行引用同一数组而引发共享内存问题;正确做法是逐行调用Arrays.fill(row, value)。

Arrays.fill() 本身不能直接初始化二维数组的全部元素,它只能填充一维数组(或对象数组的引用)。想用它“初始化矩阵”,关键在于理解二维数组是“数组的数组”,必须逐行调用 Arrays.fill(),而不是对整个二维数组对象一次调用。
为什么不能直接 Arrays.fill(matrix, value)?
因为 matrix 是一个 Object[] 类型的引用数组,它的每个元素(matrix[0]、matrix[1]…)本身是一个 int[]。Arrays.fill(matrix, -1) 实际上是把所有 matrix[i] 都设为同一个 int[] 引用——这会导致所有行共享同一块内存,改一个值,整列都变,属于典型引用陷阱。
安全有效的逐行填充写法
正确做法是遍历每一行,对每行这个一维数组单独 fill:
- 使用增强 for 循环(推荐,简洁清晰):
int[][] mat = new int[5][4];
for (int[] row : mat) {
Arrays.fill(row, 7); // 每行独立填充
} - 使用传统索引循环(适合需要行号参与逻辑的场景):
for (int i = 0; i Arrays.fill(mat[i], Integer.MAX_VALUE);
} - 注意:确保 mat 已完成声明和第一维分配(如 new int[5][4] 或 new int[5][]),否则 mat[i] 可能为 null,调用 fill 会抛 NullPointerException。
常见错误与规避方式
以下写法看似省事,实则危险:
立即学习“Java免费学习笔记(深入)”;
- Arrays.fill(mat, new int[]{1,2,3}) —— 所有行指向同一个数组对象,修改 mat[0][1] 会影响 mat[1][1] 等;
- Arrays.fill(mat, -1) —— 编译通过,但 -1 是 int,无法赋给 int[] 类型的 matrix[i],实际会报错或触发类型不匹配异常(取决于上下文);
- 忘记初始化某一行(如 jagged 数组中部分行未 new)—— 后续 fill(null) 直接崩溃。
替代方案:更灵活或更函数式的初始化
当需要每行不同长度、不同初始值,或追求代码表达力时,可考虑:
-
Arrays.setAll():适用于已分配第一维的二维数组
int[][] mat = new int[3][];
Arrays.setAll(mat, i -> {
int len = i % 2 == 0 ? 4 : 6;
int[] row = new int[len];
Arrays.fill(row, i * 10);
return row;
}); -
Stream.generate():适合创建全新二维数组,语义明确
int[][] mat = Stream.generate(() -> new int[]{0, 0, 0})
.limit(5)
.toArray(int[][]::new);


















