arrays.fill在基本类型一维数组中最快,因jvm优化为内存块拷贝;对象数组和多维数组需注意引用共享与逐行调用;超大二维数组可用并行流提速,但小数组反而更慢。

Arrays.fill 初始化大数组确实快,但快在哪、怎么用才真正发挥优势,得看场景和写法。它不是“写了就快”,而是“写对了才快”。
一维基本类型数组:JVM 自动走内存块拷贝路径
对 int[]、byte[]、boolean[] 这类数组,HotSpot JVM 会把 Arrays.fill 编译成类似 C 的 memset 指令,直接操作连续内存:
- 跳过每次循环的边界判断(不用反复检查 i
- 省掉循环变量自增和跳转指令
- 利用 CPU 批量写入能力,单次操作几十到上百字节
实测:百万级 int 数组填 -1,for 循环约 3.2 ms,Arrays.fill 约 1.1 ms —— 快近 3 倍。这不是代码少带来的快,是底层指令级优化的结果。
对象数组和多维数组:别误以为“自动加速”
Arrays.fill 对 String[]、CacheEntry[] 等引用类型数组,只是复制引用地址,不触发内存拷贝优化,本质仍是逐元素赋值:
- 填字面量或不可变常量(如 "OK"、Integer.valueOf(0))没问题
- 填 new ArrayList() 或 new Date() 就有坑——所有元素指向同一实例,改一个全变
- 二维数组不能 Arrays.fill(matrix, val),必须逐行调用:for (int[] r : matrix) Arrays.fill(r, 0)
这种逐行写法比双重 for 快 20–30%,因为 JIT 更容易优化外层 foreach,且避免内层重复读取 r.length。
超大二维数组:并行流能再压 80% 时间
当矩阵行数 ≥ 1 万、CPU 核心数 ≥ 4 时,并行处理外层索引收益明显:
- 串行逐行 fill(10000×1000):约 423 ms
- 并行流 + fill:约 58 ms(16 核机器实测)
- 写法示例:IntStream.range(0, matrix.length).parallel().forEach(i -> Arrays.fill(matrix[i], -1))
注意:并行有启动开销,小数组(如
什么情况该换别的方法?
Arrays.fill 不是万能钥匙。以下场景建议绕开:
- 要生成不同值(如 i*i、"ID_"+i)→ 用 Arrays.setAll(arr, i -> i * i)
- 数组长度固定、值已知 → 直接静态初始化:int[][] m = {{1,2},{3,4}};(零运行时成本)
- 需链式操作或配合流处理 → IntStream.range(0, n).mapToObj(i -> new Data(i)).toArray(Data[]::new)
- 对象数组需独立实例 → 必须用 for 循环或 Stream.generate,不能靠 fill
真正想提速,关键在用对场景、避开陷阱、选对调用方式。











