Arrays.fill是Java中高效填充数组的首选方法,通过JVM底层优化实现内存块拷贝,支持一维/二维数组及对象数组的精准填充,性能优于手动循环和Stream,但需注意引用共享与索引校验。

Arrays.fill 是 Java 中填充数组最直接、最高效的方式,它不创建新数组,只修改已有内容,一行代码就能完成原本需要循环十几次的操作。它的性能优势不是靠语法糖,而是 JVM 对基本类型数组的底层优化——比如把 int[] 填充编译为类似 C 的内存块拷贝(memset),跳过边界检查和索引递增开销。
一维数组:全填或区间填,按需“上色”
新建数组后快速赋予业务含义的默认值,比依赖默认初始化(如 int[] 默认为 0)更清晰,也比手写循环更安全:
- 数值占位:
int[] buf = new int[10000]; Arrays.fill(buf, -1);表示“未计算”,避免与有效值 0 混淆 - 布尔开关:
boolean[] visited = new boolean[5000]; Arrays.fill(visited, false);显式表达初始状态 - 字符串占位:
String[] names = new String[200]; Arrays.fill(names, "N/A");防止后续NullPointerException - 区间精准控制:
Arrays.fill(dp, 0, k, Integer.MAX_VALUE);只初始化前k个元素,适合 DP 预设或滑动窗口重置;注意区间是左闭右开,toIndex可等于数组长度
二维数组:逐行 fill,杜绝引用共享
Java 二维数组本质是“数组的数组”,直接 Arrays.fill(matrix, value) 会把同一引用塞进每一行,导致修改某一行某列时所有行联动——这是高频调试陷阱:
- 安全写法:
for (int[] row : matrix) Arrays.fill(row, 0);每行独立填充,无共享风险;实测比双重 for 快 20–30% - 差异化填充:
for (int i = 0; i < matrix.length; i++) Arrays.fill(matrix[i], i * 10);实现第i行填i×10 - 大矩阵提速:
IntStream.range(0, matrix.length).parallel().forEach(i -> Arrays.fill(matrix[i], -1));在 16 核机器上,10000×1000 矩阵耗时从 423 ms 降至约 58 ms
对象数组:填引用安全,填实例需谨慎
Arrays.fill() 对引用类型只做浅拷贝,填的是地址,不是新对象:
立即学习“Java免费学习笔记(深入)”;
- 填字面量或不可变对象安全:
String[] res = new String[5]; Arrays.fill(res, "OK");没问题,因为String字面量共享无副作用 - 填可变对象危险:
Arrays.fill(lists, new ArrayList<>());所有元素指向同一个List实例,add一个等于全加 - 需独立对象时,必须改用循环:
for (int i = 0; i < lists.length; i++) lists[i] = new ArrayList<>();或更函数式的Arrays.setAll(lists, i -> new ArrayList<>());
性能对比与避坑要点
相比其他方式,Arrays.fill 更稳、更轻、更易读:
- 比手动 for 循环快近 3 倍(百万级
int[]实测),且杜绝i++遗漏、越界等低级错误 - 比
Stream.generate()无装箱开销、无流管道构建成本,JVM 对其有 native 层优化 - 务必校验索引:fromIndex ≥ 0、toIndex ≤ arr.length、fromIndex ≤ toIndex,否则抛
ArrayIndexOutOfBoundsException - 对
boolean[]只能传true或false;对Object[][]直接填int值会报ArrayStoreException



















