arrays.fill 是 java 中最轻量、直接的数组初始化方式,不创建新数组、一行代码批量赋值,jvm 对基本类型有内存块拷贝优化;支持一维全填/区间填、二维逐行填防引用污染、对象数组填字面量安全但填可变对象需独立构造。

Arrays.fill 是 Java 中重置或初始化数组最轻量、最直接的方式——不创建新数组、不引入依赖、一行代码完成批量赋值,且 JVM 对基本类型有底层优化(如内存块拷贝),性能通常优于手写循环。
一维数组:全填或精准区间重置
新建数组后快速赋予业务语义的默认值,比依赖 JVM 默认初始化(如 int[] 为 0)更清晰、更安全:
- 全数组填充:int[] buf = new int[10000]; Arrays.fill(buf, -1); 表示“未计算”,避免与有效值 0 混淆
- 布尔开关显式设初态:boolean[] visited = new boolean[5000]; Arrays.fill(visited, false); 明确表达“未访问”意图
- 字符串占位防 NPE:String[] names = new String[200]; Arrays.fill(names, "N/A"); 避免后续判空时触发 NullPointerException
- 区间填充(左闭右开):Arrays.fill(dp, 0, k, Integer.MAX_VALUE); 仅预设动态规划前 k 个无效状态;注意 toIndex 可等于数组长度,但必须满足 fromIndex ≤ toIndex ≤ arr.length
二维数组:逐行 fill,杜绝引用污染
Java 二维数组本质是“一维数组的引用数组”,直接 Arrays.fill(matrix, val) 会编译失败或导致类型不匹配;更危险的是误用 Arrays.fill(matrix, new int[]{...}) —— 所有行将指向同一数组对象。
- 安全写法:for (int[] row : matrix) Arrays.fill(row, 0); 每行独立填充,无共享风险,实测比双重 for 快 20–30%
- 差异化初始化:for (int i = 0; i
- 大矩阵并行加速(≥1 万行):IntStream.range(0, matrix.length).parallel().forEach(i -> Arrays.fill(matrix[i], -1)); 16 核下 10000×1000 矩阵耗时从 423ms 降至约 58ms
对象数组:填字面量安全,填实例需独立构造
Arrays.fill 对引用类型只做浅拷贝——填的是地址,不是新对象。这点决定是否安全:
- 填不可变字面量或常量安全:Arrays.fill(strs, "OK")、Arrays.fill(flags, null)、Arrays.fill(bools, true)
- 填可变对象危险:Arrays.fill(users, new User()) → 所有 users[i] 指向同一实例,add 或 set 任一属性即全局生效
- 需独立对象时必须循环创建:for (int i = 0; i
- Boolean[] 特别注意:填 true/false 复用 Boolean.TRUE/FALSE 常量,安全;但绝不可填 new Boolean(true),既冗余又易误导
避坑要点:边界、类型与空值校验
看似简单的方法,几个细节疏忽就会引发运行时异常或逻辑错误:
- 数组不能为 null,否则抛 NullPointerException;建议调用前判空
- 索引越界:fromIndex arr.length 会抛 ArrayIndexOutOfBoundsException;可用 Math.min(toIndex, arr.length) 防御
- 类型强校验:boolean[] 只接受 true/false;传 1、"true" 或 int 值直接编译失败
- 性能认知:对固定值填充,Arrays.fill 比 Stream.generate().limit().toArray() 更快更简洁;动态值(如 UUID、随机数)则应换用 Arrays.setAll 或 Stream
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











