arrays.fill 是重置数组值的高效方法,但仅修改已有数组元素、不创建新对象;一维基本类型数组性能优且语义清晰,二维需逐行调用避免引用共享,对象数组填入同一引用需谨慎,小数组无性能优势且须校验索引合法性。

Arrays.fill 是 Java 中重置数组数据最直接的方式,但它不是“一键清空万能键”,用对了快且安全,用错了反而埋下共享引用、越界或逻辑错的坑。核心原则是:它只改值,不造新对象;只填已分配数组,不负责内存分配。
一维数组重置:又快又稳的主力场景
基本类型数组(int[]、boolean[]、double[] 等)用 fill 重置,是性能和可读性的双重优选:
- 底层常被 JVM 编译为内存块写入指令(如 memset),跳过循环边界检查和索引递增,百万级 int 数组比 for 循环快近 3 倍
- 语义明确:Arrays.fill(scores, 0) 比 for (int i = 0; i
- 支持区间重置:Arrays.fill(buffer, 100, 200, -1) 可精准覆盖滑动窗口或缓存段,无需手写 if 判断
二维数组重置:必须逐行调用,否则全乱套
Java 二维数组本质是“引用数组”,matrix[i] 存的是 int[] 的地址,不是数据本身。直接 Arrays.fill(matrix, 0) 会编译失败;而 Arrays.fill(matrix, row) 更危险——所有行指向同一块内存:
- ❌ 错误写法:int[] template = new int[5]; Arrays.fill(template, 9); Arrays.fill(matrix, template); → 修改 matrix[0][0] 就等于改了 matrix[1][0]
- ✅ 正确写法:for (int[] r : matrix) Arrays.fill(r, 0); → 每行独立重置,无共享风险,且 JIT 优化更好,比双重 for 快 20–30%
- 大矩阵(行数 ≥ 1 万)可进一步提速:用并行流处理外层索引,实测 10000×1000 矩阵从 423 ms 降至约 58 ms(16 核)
对象数组重置:填的是“同一个引用”,不是“一个个新对象”
String[]、List[]、自定义对象数组调用 fill,只是把同一个对象地址复制过去。是否安全,取决于这个对象是否可变:
- 填不可变对象安全:Arrays.fill(names, "N/A") 或 Arrays.fill(flags, Boolean.TRUE)
- 填可变对象危险:Arrays.fill(lists, new ArrayList()) → 所有位置共用一个 ArrayList,add 元素会互相污染
- 需要独立实例时,换用 Arrays.setAll(lists, i -> new ArrayList()) 或显式循环 new
性能与边界:别在小数组上较劲,也别忽略索引合法性
fill 的优势集中在中大规模基本类型数组。小数组(如长度
- 索引参数一律左闭右开:Arrays.fill(arr, from, to, val),务必确保 from ≥ 0、to ≤ arr.length,否则抛 ArrayIndexOutOfBoundsException
- 建议防御性写法:Arrays.fill(arr, Math.max(0, from), Math.min(arr.length, to), val)
- 数组必须已创建(非 null),对 null 数组调用 fill 直接抛 NullPointerException
不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











