Arrays.fill()是Java中批量赋值最直接安全的工具,仅填充内容不分配内存;支持全数组初始化、局部区间填充及多维数组逐层填充,语义清晰且性能优越。

Arrays.fill() 是 Java 中为已创建数组批量赋值最直接、最安全的工具。它不分配内存,只填充内容;不是万能初始化器,但对“设统一值”这件事,它几乎是最优解。
全数组一键初始化:语义清晰,避免默认值歧义
新建数组后 JVM 会自动初始化基本类型为 0 / false / '\u0000',但这只是技术默认,未必符合业务意图。显式调用 fill 更明确、更易维护:
- 数值占位:int[] buf = new int[1000]; Arrays.fill(buf, -1); —— 表示“未计算”或“无效”,比 0 更具语义
- 布尔开关:boolean[] visited = new boolean[500]; Arrays.fill(visited, false); —— 明确表达初始未访问状态
- 字符串占位符:String[] names = new String[10]; Arrays.fill(names, "N/A"); —— 避免后续判 null 引发 NPE
局部区间精准填充:跳过头尾,控制滑动窗口
无需手写边界判断循环,一行代码即可操作指定范围,索引规则与 substring 一致(含头不含尾):
- 只初始化前 n 个:Arrays.fill(arr, 0, n, 0)
- 清空缓存中间段:Arrays.fill(cache, offset, offset + len, 0)
- 动态规划预设无效值:Arrays.fill(dp, 0, k, Integer.MAX_VALUE)
注意:fromIndex 必须 ≥ 0,toIndex ≤ 数组长度,否则抛 ArrayIndexOutOfBoundsException;若 fromIndex == toIndex,不执行任何操作。
立即学习“Java免费学习笔记(深入)”;
多维数组逐层填充:二维不能直填,但很高效
Java 没有原生二维数组批量填充方法,但可通过 for-each + fill 实现简洁写法:
- 统一填零:int[][] matrix = new int[100][200]; for (int[] row : matrix) Arrays.fill(row, 0);
- 按行填不同值:for (int i = 0; i
这种写法比双重 for 循环少写内层索引逻辑,JVM 也更容易优化,且避免了对象引用共享问题。
对象数组注意事项:填的是引用,不是新对象
Arrays.fill(objArr, new Date()) 会让所有元素指向同一个 Date 实例——改一个,全部变。这是常见陷阱:
- 填字面量或不可变对象(如 "OK"、Integer.valueOf(1))是安全的
- 需独立可变对象时,必须用循环或 Arrays.setAll:Arrays.setAll(lists, i -> new ArrayList());
- 对 null 数组调用会触发 NullPointerException,建议先判空
性能上,Arrays.fill 是 JVM 优化的本地实现,底层可能使用内存块拷贝,效率稳定,语义远胜手动循环或 Stream。


















