Arrays.fill是Java中高效批量初始化数组的首选方法,支持一维全量/区间填充、二维逐行填充及对象数组安全赋值,但需注意空值、边界和类型匹配等细节。

Arrays.fill 是 Java 中为已创建数组批量设统一值最高效、最简洁的方式。它不分配新内存,只修改原数组内容,语义明确,JVM 还常对其做底层优化(如内存块拷贝),性能通常比手写 for 循环高 2–3 倍,远优于 Stream 固定值填充。
一维数组:全量或区间,按需“上色”
新建数组后快速赋予业务含义的默认值,避免依赖 JVM 默认初始化(如 int[] 默认为 0),让意图更清晰。
- 全数组填充:int[] buf = new int[10000]; Arrays.fill(buf, -1);——表示“未计算”,比 0 更易区分有效数据
- 布尔开关显式初始化:boolean[] visited = new boolean[5000]; Arrays.fill(visited, false);
- 字符串占位:String[] names = new String[200]; Arrays.fill(names, "N/A");(填字面量安全,无对象创建开销)
- 区间填充(左闭右开):Arrays.fill(dp, 0, 10, Integer.MAX_VALUE);——仅预设 DP 数组前 10 个无效状态
二维数组:逐行 fill,杜绝引用污染
Java 二维数组本质是“一维引用数组”,直接 Arrays.fill(matrix, value) 会编译失败(类型不匹配)或导致所有行指向同一子数组,引发数据联动 bug。
- 安全写法:for (int[] row : matrix) Arrays.fill(row, 0);——每行独立填充,无共享风险
- 不同初始值:for (int i = 0; i < matrix.length; i++) Arrays.fill(matrix[i], i * 10);
- 大矩阵提速:IntStream.range(0, matrix.length).parallel().forEach(i -> Arrays.fill(matrix[i], -1));
对象数组:填引用不填实例,警惕浅拷贝陷阱
Arrays.fill 对象数组时,只是把同一个引用复制到每个位置。若该对象可变,改一个就等于改全部。
立即学习“Java免费学习笔记(深入)”;
- 安全场景:填 null、字符串字面量、Boolean.TRUE/FALSE 等不可变常量
- 危险场景:List<String>[] lists = new ArrayList[3]; Arrays.fill(lists, new ArrayList<>());→ 三个索引共用同一 List 实例
- 需独立对象时:改用循环 new 实例,或更推荐 Arrays.setAll(persons, i -> new Person("user" + i, 20 + i));
注意事项:边界、空值与类型匹配
看似简单,但几个细节不注意就会抛异常或埋下隐患:
- 数组不能为 null,否则抛 NullPointerException
- 区间填充时 fromIndex ≥ 0、toIndex ≤ arr.length、fromIndex ≤ toIndex,否则抛 ArrayIndexOutOfBoundsException
- Boolean[] 填 true/false 安全(复用常量),但填 new Boolean(true) 绝对禁止——语义错误且易误导
- 基本类型数组虽有默认值,但显式 fill 更具可读性,尤其在数组复用场景中



















