arrays.fill() 本质调用 native 方法批量写入,比 for 循环快1.5–2倍、比 stream 快5倍以上,支持基本类型和对象数组(同引用),适用于大数组或频繁初始化场景。

Java 中用 Arrays.fill() 初始化数组,本质是调用底层 native 方法批量写入相同值,比手动 for 循环快且更安全,尤其适合大数组或频繁初始化场景。
Arrays.fill 的核心用法与适用范围
该方法支持所有基本类型数组(int[]、double[]、boolean[] 等)和对象数组(String[]、自定义类[]),但不支持泛型集合。它直接操作内存块,避免了 Java 层循环的指令开销和边界检查冗余。
- 填充整个数组:
Arrays.fill(arr, value) - 填充指定区间:
Arrays.fill(arr, fromIndex, toIndex, value)(注意toIndex是开区间,即不包含该索引) - 对对象数组,填入的是同一引用(非深拷贝),若需独立对象,仍需循环 new
性能对比:fill vs 手动循环 vs Stream
在百万级 int 数组上实测,Arrays.fill() 比传统 for 循环快约 1.5–2 倍,比 IntStream.range().forEach() 快 5 倍以上。差异主要来自 JIT 对 native 实现的极致优化,以及避免了 Stream 创建中间对象和函数式调用开销。
- 慎用 Stream 初始化数组:语法简洁但性能代价高,仅适合小规模或可读性优先的场景
- for 循环在小数组(
- fill 在多线程环境下线程安全——它只修改目标数组,无共享状态
实战避坑:常见误用与注意事项
看似简单的方法,实际使用中容易忽略细节导致逻辑错误或性能浪费。
- 对象数组填 null 是安全的,但填新实例(如
Arrays.fill(arr, new Object()))会让所有元素指向同一个对象 - 区间填充时务必校验
fromIndex ≤ toIndex,否则抛IllegalArgumentException - 对已存在的数组重复 fill 不会扩容,也不会触发 GC;但若数组引用被丢弃,旧数组才可能被回收
- 二维数组需逐行 fill:
for (int[] row : matrix) Arrays.fill(row, 0),不能直接传 matrix
替代方案:何时不该用 fill?
不是所有初始化都适合 fill。当需要按索引生成不同值(如递增序列、随机数、计算结果),fill 就无能为力。
- 生成等差数列:用
IntStream.iterate()或传统循环 - 填充随机值:必须循环调用
Random.nextInt() - 从已有数据源复制:优先用
System.arraycopy()或Arrays.copyOf() - 构造不可变数组:fill 后建议封装为 Collections.unmodifiableList() 或使用不可变容器库
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











