arrays.fill 是 java 填充数组最高效方式,jvm 对基本类型数组优化为内存块拷贝指令,性能比 for 循环快近 3 倍;二维数组需逐行 fill 避免引用共享;对象数组仅复制引用,填可变对象需警惕共享坑;区间填充为左闭右开,须校验边界。

Arrays.fill 是 Java 中填充数组最直接、最高效的方式,不是靠“写得少”,而是 JVM 在底层做了真实优化——尤其对基本类型数组,它常被编译成类似 C 的内存块拷贝指令,跳过循环开销,性能比手写 for 快近 3 倍。
一维基本类型数组:用对就快,快在底层
int[]、boolean[]、double[] 这类数组,Arrays.fill 的优势是硬核的:
- JVM 会将其内联为 memset 或批量写入指令,不检查每次索引、不递增变量、不跳转,直接操作连续内存
- 实测百万级 int 数组:for 循环约 3.2 ms,Arrays.fill(arr, -1) 约 1.1 ms
- 即使数组已默认初始化为 0,显式 fill(-1) 或 fill(false) 也更语义清晰,避免误把“默认值”当成“业务含义”
二维数组:逐行 fill 才安全,还更快
Java 二维数组是“数组的数组”,直接 Arrays.fill(matrix, val) 是典型陷阱——所有行指向同一引用,改一行等于改全部。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确写法:for (int[] row : matrix) Arrays.fill(row, 0); —— 每行独立填充,无共享风险
- 这个写法比双重 for 循环快 20–30%,因为 JIT 更易优化外层增强 for,且避免了内层重复读取 row.length
- 大矩阵(≥1 万行)可进一步提速:IntStream.range(0, matrix.length).parallel().forEach(i -> Arrays.fill(matrix[i], -1)),16 核机器实测耗时从 423 ms 降至约 58 ms
对象数组:填引用不填实例,别踩共享坑
Arrays.fill 对对象数组只复制引用,不创建新对象。这既是优点,也是雷区:
- 填 String 字面量("OK")、Integer 常量(123)、null —— 安全,不可变或无副作用
- 填 new ArrayList()、new StringBuilder()、自定义可变对象 —— 危险!所有元素共用一个实例,add 或 append 会全局生效
- 需要独立对象?改用循环:for (int i = 0; i (); 或用 Arrays.setAll(arr, i -> new Data(i))
区间填充:左闭右开,精准控制不越界
Arrays.fill(arr, from, to, val) 的范围是 [from, to),即包含 from,不包含 to。这是高频出错点:
- 滑动窗口重置:Arrays.fill(cache, left, right + 1, 0)
- DP 数组预设有效段:Arrays.fill(dp, 1, n + 1, Integer.MAX_VALUE),跳过哨兵位 dp[0]
- 务必校验:from ≥ 0、to ≤ arr.length、from ≤ to,否则抛 ArrayIndexOutOfBoundsException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










