arrays.fill是java中重置数组最直接高效的方式,不创建新数组而仅修改原内容,支持全数组、局部区间、多维及对象数组重置,但对象数组需警惕浅拷贝陷阱。

Arrays.fill 是 Java 中重置数组最直接高效的方式,不创建新数组,只修改原内容,一行代码就能完成原本需要循环十行的工作。它不是万能初始化器,但对“已存在数组设统一值”这件事,几乎是最优解。
一维数组全量与区间重置
新建数组后统一设默认值,或复用前清空状态,用最简重载即可:
- 基本类型安全高效:int[] arr = new int[10000]; Arrays.fill(arr, -1); —— 所有元素立刻为 -1,JVM 可能触发 intrinsic 优化,比手写 for 更快
- 布尔/字节全覆盖:Arrays.fill(flags, true)、Arrays.fill(bytes, (byte) 0xFF),无需额外类型转换
- 局部精准控制:语法是 Arrays.fill(array, fromIndex, toIndex, value),区间为左闭右开 [fromIndex, toIndex),例如 Arrays.fill(data, 100, data.length, 0) 安全清空后段
- 常见用途:清零某段 int 数组、重置滑动窗口内的数据、动态规划中预设无效状态(如 Arrays.fill(dp, 0, k, Integer.MAX_VALUE))
二维及多维数组逐层填充
Java 不支持二维数组直接填充,但可通过增强 for 循环高效实现,语义清晰且避免引用共享:
- 规则矩阵每行同值:for (int[] row : matrix) Arrays.fill(row, 7);
- 每行不同值:for (int i = 0; i
- 切忌写成 Arrays.fill(matrix, new int[]{0,0}) —— 这只会让所有行指向同一个一维数组对象
- 大规模矩阵(≥1 万行)可结合并行流提速:IntStream.range(0, matrix.length).parallel().forEach(i -> Arrays.fill(matrix[i], -1)); 实测 10000×1000 矩阵耗时从 423 ms 降至约 58 ms
对象数组重置:警惕浅拷贝陷阱
Arrays.fill 对象数组时填的是引用,不是新实例,这点必须明确:
- 填字面量或 null 安全:Arrays.fill(users, null)、Arrays.fill(strs, "")
- 填 new 对象危险:Arrays.fill(objArr, new Date()) 会让所有元素指向同一实例;改一个,全跟着变
- 需独立对象时必须循环创建:for (int i = 0; i
- String、Integer 等不可变类型填字面量无副作用,但 ArrayList、Date、自定义可变类务必单独实例化
性能与安全边界提醒
看似简单,但几个细节容易引发隐蔽问题:
- boolean[] 只能填 true 或 false,传 1 或 "true" 会编译失败
- fromIndex 必须 ≥ 0,toIndex ≤ arr.length,且 fromIndex ≤ toIndex,否则抛 ArrayIndexOutOfBoundsException
- 不处理 null 数组:String[] arr = null; Arrays.fill(arr, "x") → 直接 NPE
- JVM 对基本类型数组有底层优化(类似 memset),性能显著优于 for 循环和 Stream;但对引用类型,只是复制地址,无构造开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











