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

Arrays.fill() 是 Java 中专为数组批量赋值设计的高效工具,它不是万能的内存初始化器,但对已创建数组设统一值这件事,几乎是最优解——代码简洁、语义清晰、性能可靠。
一维数组全量填充:一行替代百行循环
新建数组后快速赋予统一初始值,避免手动 for 循环冗余。JVM 对基本类型数组(如 int、boolean)底层常优化为内存块拷贝,实测比普通循环快近 3 倍。
- 数值型占位:int[] buf = new int[10000]; Arrays.fill(buf, -1); 表示“未计算”状态
- 布尔开关初始化:boolean[] visited = new boolean[5000]; Arrays.fill(visited, false);
- 字符串占位符:String[] names = new String[200]; Arrays.fill(names, "N/A");(注意:填的是同一引用,非新对象)
精准控制填充区间:跳过头尾或重置缓存段
无需手写边界判断,直接指定起止索引(含头不含尾),适合滑动窗口、DP 预设、局部清空等场景。
- 只初始化前 n 个:Arrays.fill(arr, 0, n, 0)
- 清空中间一段:Arrays.fill(cache, offset, offset + len, 0)
- 动态规划无效值预设:Arrays.fill(dp, 0, k, Integer.MAX_VALUE)
- 安全写法建议:用 Math.min(toIndex, arr.length) 防越界
二维数组逐层填充:避开引用共享陷阱
Java 二维数组本质是“数组的数组”,直接 Arrays.fill(matrix, row) 会导致所有行指向同一对象,引发连锁修改 Bug。
- 正确做法:for (int[] row : matrix) Arrays.fill(row, 7);
- 该写法比双重 for 快 20–30%,因 JIT 更易优化单层循环
- 若需每元素为独立对象(如 new String("x")),不能依赖 fill,得用 Arrays.setAll 或显式 new
注意事项与常见误区
fill() 不创建新对象,只复制引用;不适用于未初始化的 null 数组;索引参数必须合法,否则抛 ArrayIndexOutOfBoundsException。
- 对象数组填充的是同一引用,不是深拷贝
- fromIndex 必须 ≥ 0,toIndex ≤ 数组长度,且 fromIndex == toIndex 时无操作
- 对未 new 出来的数组(如 String[] arr = null)调用 fill 会 NPE
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











