arrays.fill是java中高效批量赋值数组的工具,支持一维数组全量/区间填充、二维数组逐层填充,但不创建新对象、不处理null数组,需注意引用共享与索引越界。

Arrays.fill 是 Java 中最简单高效的数组批量赋值工具,特别适合给基本类型数组(如 int[]、double[]、boolean[] 等)统一设置初始值。它不创建新数组,只修改原数组内容,开销极小,且代码简洁可读。
一、基础用法:给整个数组设同一个值
直接传入数组和要填入的值即可:
// 示例:初始化一个长度为 5 的 int 数组,全部设为 -1
int[] arr = new int[5];
Arrays.fill(arr, -1);
// 结果:[-1, -1, -1, -1, -1]
// 同样适用于其他基本类型
boolean[] flags = new boolean[3];
Arrays.fill(flags, true); // [true, true, true]
二、指定范围填充:只改某一段
通过起始索引(含)和结束索引(不含)控制作用区间:
- 第三个参数是起始位置(从 0 开始),第四个是结束位置(不包含)
- 索引越界会抛出 ArrayIndexOutOfBoundsException,使用前建议校验
- 常用于“保留头部配置,重置后续数据”场景
// 示例:只把下标 1~3(即第2到第4个元素)设为 99
int[] data = {10, 20, 30, 40, 50};
Arrays.fill(data, 1, 4, 99);
// 结果:[10, 99, 99, 99, 50]
三、常见误区与注意事项
- 不能用于对象数组的“深度初始化”:对 String[] 使用 fill(null) 只是让每个元素引用为 null,并不创建新 String 对象
- char[] 填充需注意类型匹配:Arrays.fill(charArr, 'A') 正确;用 Arrays.fill(charArr, 65) 也可(自动转为 char),但语义不如字符字面量清晰
- 多维数组需逐层调用:int[][] matrix = new int[3][4]; 不能直接 fill 整个 matrix,要 for 循环对每行调用 fill
- 原始数组必须已初始化:传入 null 会立即抛出 NullPointerException
四、替代方案对比:什么时候不用 fill?
- 需要按索引规律赋不同值(如 i*i、i%2==0 ? 1 : 0)→ 用 for 循环更自然
- 初始化后立刻被覆盖,且数组很大 → fill 可能白费一次遍历,可考虑延迟赋值
- 需要不可变语义或函数式风格 → 可用 IntStream.range(0, n).mapToObj(i -> value).toArray(),但性能差很多











