arrays.fill是java中高效批量赋值数组的工具,支持全数组/区间填充、基本类型优化、对象数组引用赋值,但二维数组需逐层调用,对象数组需防浅拷贝陷阱,null数组须判空。

Arrays.fill 是 Java 中最常用、最直观的数组批量赋值工具,不造新数组,只改已有内容,一行代码替代十行循环。
全数组填充:初始化和重置最简写法
新建数组后统一设默认值,或复用前清空状态,直接调用最简重载即可:
- 基本类型安全高效:int[] arr = new int[10000]; Arrays.fill(arr, -1); —— 所有元素立刻为 -1,JVM 可能触发 intrinsic 优化,比手写 for 更快
- 对象数组填的是引用:String[] strs = new String[5]; Arrays.fill(strs, "OK"); 合法且常用;但 Arrays.fill(strs, new Date()) 会让所有位置指向同一个 Date 实例
- 布尔/字节等类型全覆盖:Arrays.fill(flags, true)、Arrays.fill(bytes, (byte) 0xFF),无需额外类型转换
区间填充:精准控制,避免越界风险
只初始化某一段(如缓存头部、滑动窗口、DP 数组前缀),用三参数版本更可靠:
- 语法是 Arrays.fill(array, fromIndex, toIndex, value),区间为左闭右开:[fromIndex, toIndex)
- toIndex 可等于数组长度,例如 Arrays.fill(data, 100, data.length, 0) 安全清空后段
- 常见错误:把 toIndex 写成 data.length + 1 或混淆“包含/不包含”,会抛 ArrayIndexOutOfBoundsException
二维数组处理:必须逐层调用
Java 二维数组本质是“数组的数组”,Arrays.fill 无法穿透第二层,需配合 for 循环使用:
- 正确做法:int[][] mat = new int[200][300]; for (int[] row : mat) Arrays.fill(row, 7);
- 错误写法:Arrays.fill(mat, new int[]{0,0}) —— 这只是把每行引用都设为同一个一维数组,不是填数字
- 若需每行不同初值,可在循环中动态传参:Arrays.fill(row, i * 10);
对象数组避坑要点
引用类型数组的填充逻辑容易引发隐蔽 bug,关键在理解“浅拷贝”语义:
- Arrays.fill(lists, new ArrayList()) → 所有 lists[i] 指向同一个 ArrayList,增删操作全局可见
- 要每个位置独立对象,必须显式创建:for (int i = 0; i ();
- 也可用函数式替代:Arrays.setAll(lists, i -> new ArrayList()); 更清晰表达“每个都是新实例”
- null 数组调用 fill 会立即抛 NullPointerException,建议先判空:if (arr != null) Arrays.fill(arr, val);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











