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),区间左闭右开;例如 Arrays.fill(data, 100, data.length, 0) 安全清空后段,常用于滑动窗口或 DP 数组前缀预设
二维数组重置要逐行调用
Java 的二维数组本质是“数组的数组”,直接 Arrays.fill(matrix, 0) 会把每行引用设为 null 或报错,不是填格子,而是改指针:
- 正确做法:for (int[] row : matrix) Arrays.fill(row, 0); 每行独立填充,语义清晰且 JIT 更易优化
- 不同初始值可配合索引:for (int i = 0; i < matrix.length; i++) Arrays.fill(matrix[i], i * 10);
- 大矩阵提速(≥1 万行):用并行流处理外层,IntStream.range(0, matrix.length).parallel().forEach(i -> Arrays.fill(matrix[i], -1)); 实测 10000×1000 矩阵耗时从 423 ms 降至约 58 ms
对象数组重置需防浅拷贝陷阱
Arrays.fill 对象数组时只复制引用,不创建新实例。这点必须明确,否则会导致多个位置指向同一对象:
立即学习“Java免费学习笔记(深入)”;
- 填字面量或 null 安全:Arrays.fill(names, "N/A")、Arrays.fill(users, null)
- 填 new 对象危险:Arrays.fill(objArr, new Date()) 会让所有元素共享同一实例;改一个,全跟着变
- 需独立对象时必须显式创建:for (int i = 0; i < objArr.length; i++) objArr[i] = new User();
重置不只是清零,更是语义表达
用 fill 重置,不只是技术动作,更是业务意图的显式声明:
- 填 -1 表示“未计算”,填 999 表示“暂不可用”,填 false 表示“未校验”——这些都不是默认值,必须显式写出
- 避免魔法数字:用 StatusEnum.PENDING.getCode() 替代硬编码 2,用 CacheEntry.EMPTY 替代 null
- 游戏地图中,重置可能意味着填边界墙(1)、空地(0)、地形码(2=草地,3=水域),而非全填 0


















