Arrays.fill 是 Java 中重置数组最轻量高效的方式,不创建新数组只改原内容,一行代码批量赋值;适用于一维基本类型数组的全量或区间重置,二维数组需逐行调用避免引用共享,对象数组填不可变对象安全、可变对象需用 Arrays.setAll。

Arrays.fill 是 Java 中重置数组最轻量、最高效的方式,不创建新数组,只改原内容,一行代码完成批量赋值。它不是万能初始化器,但对“已存在数组设统一值”这件事,是语义最清晰、JVM 优化最到位的首选。
一维数组:全量或区间重置,精准又省心
新建数组后快速赋予初始状态,或复用前一键清空,无需手写循环:
- 数值占位:
int[] buf = new int[10000]; Arrays.fill(buf, -1);表示“未计算” - 布尔开关:
boolean[] visited = new boolean[5000]; Arrays.fill(visited, false); - 字符串占位:
String[] names = new String[200]; Arrays.fill(names, "N/A");(注意:填的是同一引用) - 区间重置更灵活:用
Arrays.fill(arr, fromIndex, toIndex, value),范围左闭右开,比如Arrays.fill(dp, 1, n+1, Integer.MAX_VALUE)只初始化有效状态段,跳过哨兵位
二维数组:逐行调用,避开引用共享雷区
Java 二维数组本质是“数组的数组”,Arrays.fill(matrix, row) 会让所有行指向同一个对象,修改一处,处处联动——这是最常见也最隐蔽的 bug 源头。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 安全写法:用增强 for 循环逐行填充,
for (int[] r : matrix) Arrays.fill(r, 0); - 若需按区域重置,比如第 2~4 行全部设为 -1:
for (int i = 2; i < 5; i++) Arrays.fill(matrix[i], -1); - 若某一行只重置中间三列:
Arrays.fill(matrix[r], c1, c2, 99);
对象数组:填不可变对象安全,填可变对象必须独立构造
Arrays.fill 对对象数组只是复制引用,不是创建新实例:
立即学习“Java免费学习笔记(深入)”;
- 填
"OK"或Integer.valueOf(42)安全,因为 String 和 Integer 不可变 - 填
new ArrayList<>()或new StringBuilder()危险,所有位置共享同一对象,后续 add 或 append 会相互干扰 - 需要独立对象时,改用
Arrays.setAll(arr, i -> new MyObj(i)),按索引生成,天然隔离
性能关键点:快在哪?什么情况下别硬套?
对一维基本类型数组(int、byte、boolean 等),JVM 会将 Arrays.fill 内联为内存块拷贝指令(类似 C 的 memset),跳过边界检查和循环控制,实测比 for 循环快近 3 倍。但这个优势不适用于:
- 对象数组:只是逐元素赋引用,性能≈手写 for
- 二维及以上数组:必须手动展开,无自动优化
- 小数组(如长度 < 100):启动开销可能反超收益
- 需要不同值的场景(如
i*i、"ID_"+i):应选Arrays.setAll


















