Arrays.fill是Java中高效批量设值的方法,适用于一维数组全量填充、精准区间填充、对象数组与二维数组的正确初始化,但需注意空指针、越界及引用共享陷阱。

Arrays.fill 是 Java 中为已创建数组批量设统一值最直接、高效的方式,特别适合大规模缓存、状态标记、计数器等场景。它不分配新内存,只写值,语义清晰、性能稳定,一行代码就能替代冗长易错的 for 循环。
一维数组全量填充:初始化与重置最常用操作
新建数组后快速赋予默认业务值,是最典型用法。JVM 对基本类型数组常做底层优化(如内存块拷贝),实测比普通循环快近 3 倍。
- 数值占位:int[] buf = new int[100000]; Arrays.fill(buf, -1); —— 表示“未计算”或“无效”状态
- 布尔开关:boolean[] visited = new boolean[50000]; Arrays.fill(visited, false); —— 显式初始化提升可读性,尤其在复用数组时
- 字符串占位:String[] names = new String[200]; Arrays.fill(names, "N/A"); —— 注意填的是同一引用,非新对象实例
精准区间填充:跳过头尾、分段重置更安全
无需手写边界判断,直接指定起止索引(含头不含尾),适合滑动窗口、DP 预设、局部清空等场景。
- Arrays.fill(arr, 2, 7, -1); —— 将索引 2、3、4、5、6 共 5 个位置设为 -1
- 防止越界可配合校验:int end = Math.min(50, arr.length); Arrays.fill(arr, 10, end, 0);
- 缓存复用时重置某段:Arrays.fill(cacheBuffer, offset, offset + len, (byte) 0xFF);
对象数组与二维数组:避开引用共享陷阱
Arrays.fill 对对象数组只复制引用,对二维数组只作用于“行引用层”,不是“数据层”。误用会导致所有元素共用同一对象或同一行内存。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:int[][] grid = new int[5][5]; Arrays.fill(grid, new int[]{0,0,0,0,0}); —— 所有行指向同一个一维数组
- 正确逐行填充:for (int[] row : grid) Arrays.fill(row, -1);
- 对象数组需独立实例时,不能依赖 fill:List<String>[] lists = new ArrayList[10]; for (int i = 0; i < lists.length; i++) lists[i] = new ArrayList<>();
- 若占位对象不可变且共享安全(如 CacheEntry.EMPTY),则 Arrays.fill(entries, CacheEntry.EMPTY); 完全可用
性能与边界注意事项:简单但不容忽视
Arrays.fill 是原地操作,无装箱开销,支持所有基本类型和 Object 类型数组,但必须确保前提条件成立。
- 数组不能为 null,否则抛 NullPointerException;建议调用前判空
- 索引越界会抛 IllegalArgumentException(fromIndex > toIndex)或 ArrayIndexOutOfBoundsException(超出长度)
- 基本类型数组默认初始化为 0 / false / '\u0000',但显式 fill 更明确业务意图
- 不适用于堆外内存、超大数组(GB 级)、或需要并发安全初始化的场景


















