arrays.fill是java中高效填充数组的方法,适用于基本类型、字符串及对象数组,支持区间填充和二维数组逐行初始化,但需避免可变对象的浅拷贝陷阱。

Arrays.fill 是 Java 中填充数组最直接高效的方式,尤其适合固定值批量赋值场景。它不创建新数组、不引入依赖,一行代码完成初始化,且 JVM 对基本类型有底层优化,性能明显优于手写循环。
一维基本类型数组:用对就快近3倍
对 int[]、boolean[]、byte[] 等基本类型数组,HotSpot JVM 会将 Arrays.fill 编译为内存块拷贝指令(类似 C 的 memset),跳过边界检查和循环控制开销:
- 填 100 万元素 int 数组:for 循环约 3.2 ms,Arrays.fill 仅约 1.1 ms
- 填 boolean[] 时显式写 Arrays.fill(visited, false) 比依赖默认 false 更清晰,尤其在数组复用时
- 字符串字面量安全:String[] names = new String[200]; Arrays.fill(names, "N/A"); —— 填的是共享引用,无副作用
二维数组初始化:逐行 fill 才安全又高效
Java 二维数组是“数组的数组”,直接 Arrays.fill(matrix, row) 会让所有行指向同一引用,引发数据联动 bug:
- ✅ 正确写法: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 对引用类型只复制地址,不构造新对象。这点极易被忽略:
- 填不可变对象安全:Arrays.fill(strs, "OK") 或 Arrays.fill(dates, LocalDate.now()) —— 不可变,无风险
- 填可变对象危险:Arrays.fill(lists, new ArrayList()) → 所有位置共用一个 List,add 一个元素等于全加
- 需独立实例时,改用循环:for (int i = 0; i ();
- 或更简洁:Arrays.setAll(lists, i -> new ArrayList()); —— 按索引生成,语义明确,天然防共享
区间填充与边界控制:精准重置很实用
动态规划、滑动窗口、缓存局部清空等场景,常只需填某一段:
- 语法:Arrays.fill(arr, fromIndex, toIndex, value),区间左闭右开 [fromIndex, toIndex)
- 示例:int[] dp = new int[100]; Arrays.fill(dp, 0, 10, Integer.MAX_VALUE); —— 仅预设前10个为无效值
- 务必校验:fromIndex ≥ 0、toIndex ≤ arr.length、fromIndex ≤ toIndex,否则抛 ArrayIndexOutOfBoundsException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











