arrays.fill()推荐用于已创建数组的整体或局部统一赋值,如初始化默认值(int[] arr = new int[1000]; arrays.fill(arr, -1))、重置缓存、区间填充(左闭右开)及替代易错循环;对基本类型数组,jvm底层优化为内存块拷贝,性能比for循环快2–5倍。

Java 中用 Arrays.fill() 批量填充数组,比手动 for 循环更简洁、更高效,尤其在处理基本类型数组时,JVM 会做底层优化(如内存块拷贝),性能优势明显。
适用场景:哪些情况推荐用 fill?
适合对已创建的数组整体或局部统一赋值,比如:
- 初始化数组为默认值(如
int[] arr = new int[1000]; Arrays.fill(arr, -1);) - 重置数组状态(如清空缓存、复位标记位)
- 填充某一段区间(支持起始/结束索引,避免额外子数组创建)
- 替代重复调用
set或循环赋值,提升可读性与维护性
基础用法与重载版本速查
Arrays.fill() 提供多种重载,覆盖常用需求:
-
fill(int[] a, int val):全数组填同一 int 值 -
fill(int[] a, int fromIndex, int toIndex, int val):仅填充[fromIndex, toIndex)区间(左闭右开) - 其他类型同理:支持
byte、long、double、Object等 - 注意:对引用类型数组,填的是同一对象引用,不是深拷贝
性能对比:为什么 fill 更快?
以填充 100 万个 int 元素为例:
- for 循环:JVM 需逐个执行字节码指令,受边界检查、循环变量更新等开销影响
-
Arrays.fill():底层通常调用Unsafe.setMemory()或 JVM 内置的内存批量写入指令(如 x86 的rep stos),直接操作连续内存块 - 实测显示,基本类型数组填充,fill 比普通 for 快 2–5 倍;对象数组因涉及引用赋值,差距较小但代码更清晰
实用技巧与避坑提醒
用好 fill 还要注意这些细节:
- 索引范围必须合法,否则抛
ArrayIndexOutOfBoundsException;建议配合Math.min()做安全截断 - 对二维数组,
fill只作用于外层数组元素(即每行引用),如需“清空”二维 int 数组,得嵌套调用 - 与
Arrays.copyOf()或Stream.generate()不同,fill不创建新数组,节省堆内存 - 若需填充非固定值(如递增序列),仍需用循环或 IntStream.range
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











