arrays.fill 的部分填充能力核心在于左闭右开区间 [from, to),即填 arr[from] 到 arr[to-1],共 to−from 个元素;需确保 from ≥ 0 且 to ≤ arr.length,否则抛异常;常用 math.min(end, arr.length) 防越界;典型场景包括 dp 初始化、滑动窗口重置、保留头尾元数据等。

Arrays.fill 的部分填充能力,核心就在那三个参数:数组、起始索引、结束索引和值。它不写循环、不手动判界,但用错范围就白填或崩掉——关键不是“怎么填”,而是“填哪一段”。
区间规则:含头不含尾,不是直觉里的“到第几个”
Arrays.fill(arr, from, to, val) 修改的是 arr[from] 到 arr[to - 1] 这一段,共 to − from 个元素。这个 [from, to) 左闭右开规则,和 substring、List.subList 完全一致。
- 想把索引 3、4、5 三个位置设为 0?写
Arrays.fill(arr, 3, 6, 0) - 想跳过第一个元素,从第 2 个开始全填 −1?写
Arrays.fill(arr, 1, arr.length, −1) - 如果 from == to,比如
Arrays.fill(arr, 5, 5, 9),什么也不做,合法但无效 - from 必须 ≥ 0,to 必须 ≤ arr.length,否则直接抛异常,不会静默失败
实战中怎么防越界:别硬编码,用 Math.min 包一层
实际场景里,to 常来自计算(比如窗口右边界 winStart + winSize),很容易超出数组长度。与其每次 if 判断,不如用 Math.min(end, arr.length) 收口:
int end = offset + len;Arrays.fill(buf, offset, Math.min(end, buf.length), 0);
这样即使 offset + len 超了,也能安全填到数组末尾,程序不崩溃,逻辑也符合预期。
哪些场景最常用:不是为了炫技,而是解决真实问题
局部填充不是语法练习,而是算法和工程中的刚需操作:
-
DP 数组初始化:比如
int[] dp = new int[n + 1]; Arrays.fill(dp, 1, n + 1, Integer.MAX_VALUE);,留 dp[0] 当哨兵,只初始化有效状态段 -
滑动窗口重置:每次移动后,
Arrays.fill(cache, left, right, 0)清空当前窗口覆盖的连续内存段 - 保留头尾元数据:日志缓冲区中,只清中间 payload 段,头尾校验位不动
-
棋盘/表格模拟:如
char[] row = new char[8]; Arrays.fill(row, ' '); Arrays.fill(row, 2, 5, 'X');表示第 2~4 列落子
二维数组怎么办:不能跨维,必须手动控制行和列
Arrays.fill 不认识“二维”,它只认一维。对 int[][] matrix,你要填某几行、某几列,得自己拆解:
-
填 r1 到 r2−1 行的全部列:
for (int i = r1; i -
填第 r 行的 c1 到 c2−1 列:
Arrays.fill(matrix[r], c1, c2, val); -
填矩形区域 [r1,r2) × [c1,c2):
for (int i = r1; i
注意检查 matrix[i] 是否为 null,以及列索引是否越界,避免 NullPointerException 或 ArrayIndexOutOfBoundsException。
不复杂但容易忽略:它只改值,不建新对象;只认一维,不管嵌套;填得准,才真省事。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











