arrays.fill是java中为一维数组批量赋相同初始值最简洁安全的工具,支持全数组或区间填充(左闭右开),但不创建新对象、不适用于多维数组整体初始化,对象数组填充时需防引用共享。

Arrays.fill 是 Java 中快速、简洁地为一维数组所有元素赋相同初始值的工具方法,无需手动循环,代码更安全且可读性高。
基本用法:给整个数组赋同一值
最常用场景是初始化全部元素。只需传入数组和要填充的值,方法会自动遍历并赋值:
- 适用于任意类型数组(int、double、String、自定义对象等)
- 原始类型数组填数值,引用类型数组填引用(如 null 或 new String("a"))
- 注意:对引用类型数组,fill 的是“同一个对象引用”,不是新对象副本
int[] arr = new int[5];
Arrays.fill(arr, 7); // arr 变为 [7, 7, 7, 7, 7]
指定范围填充:只改其中一段
如果只想初始化子区间(比如前3个或后2个),可用带起始和结束索引的重载版本:
- 签名:
Arrays.fill(array, fromIndex, toIndex, value) - fromIndex 包含,toIndex 不包含(符合 Java 通用区间习惯)
- 索引越界会抛
IllegalArgumentException,建议确保0 ≤ fromIndex ≤ toIndex ≤ array.length
String[] names = new String[4];
Arrays.fill(names, 1, 3, "unknown"); // names 变为 [null, "unknown", "unknown", null]
常见误区与注意事项
用得快,但容易踩坑:
- 对对象数组,
Arrays.fill(arr, new Object())所有元素都指向同一个实例——修改任一元素会影响全部 - 若需每个元素是独立对象,应配合循环或 Stream(如
Arrays.setAll(arr, i -> new Object())) - 不能用于多维数组整体初始化(二维数组需对每行单独 fill)
- 数组为 null 时调用会直接抛
NullPointerException
对比手动循环:为什么推荐 fill
虽然 for 循环也能实现,但 Arrays.fill 更优:
- 语义明确:一眼看出“批量设值”意图,而非逻辑处理
- 性能不输:JDK 内部通常做了优化(如底层可能用内存块复制)
- 减少出错:不用手写边界判断,避免
i 这类经典 off-by-one 错误 - 兼容性好:从 JDK 1.2 就存在,无版本顾虑











