Arrays.fill 处理数组特定区域初始化,核心是使用带索引范围的重载方法 Arrays.fill(array, fromIndex, toIndex, value),遵循左闭右开区间约定(fromIndex 包含、toIndex 不包含),要求 0 ≤ fromIndex ≤ toIndex ≤ array.length,支持所有一维数组类型;对引用类型填入同一实例,需警惕共享修改风险。

Arrays.fill 处理数组特定区域的数据初始化,核心在于用好带索引范围的重载方法:它能精准控制“从哪开始、到哪结束、填什么值”,避免全量填充的冗余,也规避手动循环易错的风险。
指定区间填充:左闭右开是关键
调用 Arrays.fill(array, fromIndex, toIndex, value) 时,fromIndex 包含、toIndex 不包含——这是 Java 通用区间约定,也是最容易出错的地方。比如想把索引 3、4、5 三个位置设为 -1,应写 Arrays.fill(arr, 3, 6, -1),而不是 Arrays.fill(arr, 3, 5, -1)。
- 索引必须合法:0 ≤ fromIndex ≤ toIndex ≤ array.length,越界直接抛
IllegalArgumentException - 适用于所有一维数组类型:int[]、String[]、boolean[] 等均可
- 对引用类型数组(如 String[]),填入的是同一个字符串实例,不是副本
常见业务场景与写法
特定区域初始化不是技术炫技,而是贴合真实需求的高效表达:
- 预留头部元数据区:如 byte[] buffer = new byte[1024]; Arrays.fill(buffer, 8, buffer.length, (byte)0xFF); —— 前 8 字节留作协议头,其余全置为 0xFF
- 分段标记状态:int[] status = new int[100]; Arrays.fill(status, 20, 50, 1); Arrays.fill(status, 70, 90, 2); —— 分别标记“处理中”和“待审核”区间
- 重置局部缓存块:char[] chars = new char[256]; … // 使用后只需清空已用部分;Arrays.fill(chars, 0, usedCount, '\0');
避开引用共享陷阱
当对对象数组(如 List[]、CustomObj[])使用区间 fill 时,填入的是同一对象引用。若该对象可变,后续修改会影响整个区间:
- 安全做法:填
null、不可变对象(如"N/A"、Integer.valueOf(0))或常量 - 危险写法:
Arrays.fill(objs, 0, 5, new ArrayList())→ 5 个元素共用一个 list,add 一次就全变 - 需独立实例?改用循环或
Arrays.setAll():Arrays.setAll(objs, i -> i >= 0 && i () : null);
二维数组的“特定区域”要拆解处理
Arrays.fill 无法直接操作二维数组的“矩形区域”,因为二维数组本质是一维引用数组。想初始化某几行的某几列,必须分层操作:
- 先确定目标行范围(如第 2 到第 4 行),再对每行单独调用 fill
- 示例:int[][] grid = new int[6][8]; for (int i = 2; i < 5; i++) { Arrays.fill(grid[i], 1, 6, 9); } —— 给第 2、3、4 行的第 1~5 列(共 5 个)填 9
- 不要尝试
Arrays.fill(grid, ...):编译不通过或引发运行时错误

















