arrays.fill(array, fromindex, toindex, value)填充左闭右开区间[fromindex, toindex),需确保0≤fromindex≤toindex≤array.length,否则抛异常;底层内存块拷贝优化使基本类型性能显著优于for循环。

Java 中用 Arrays.fill() 对数组指定区间高效填充,关键在于正确理解其参数含义与边界处理逻辑,避免越界或漏填。
fill 方法的区间语义要吃透
Arrays.fill(array, fromIndex, toIndex, value) 填充的是左闭右开区间:包含 fromIndex,不包含 toIndex。比如对长度为 10 的数组调用 fill(arr, 2, 5, 9),实际修改的是索引 2、3、4 这三个位置。
- 若
fromIndex == toIndex,不执行任何操作(合法且安全) - 若
fromIndex > toIndex,抛出IllegalArgumentException - 两个索引都必须在
[0, array.length]范围内,越界直接抛ArrayIndexOutOfBoundsException
原生 fill 比手写 for 循环快在哪
底层基于内存块复制优化(尤其在 JVM 启用 intrinsic 优化时),对基本类型数组(如 int[]、byte[])性能显著优于 Java 层面的循环。JDK 9+ 对大数组还会自动分段并行处理(取决于数组大小和 JVM 配置)。
- 填充 100 万元素的
int[],fill()通常比等效 for 循环快 2–3 倍 - 对象数组(如
String[])虽无内存拷贝优势,但减少字节码指令数,仍有小幅提升 - 注意:仅当填充值固定且区间明确时才适用;动态计算每个位置值仍需手动循环
实战中容易踩的坑
常见错误不是语法问题,而是逻辑误判导致覆盖范围不对或异常中断:
- 混淆“长度”和“结束索引”:想填前 5 个元素,错写成
fill(arr, 0, 5)(正确) vsfill(arr, 0, 4)(少填 1 个) - 对空数组或 null 数组调用 ——
fill(null, ...)直接 NPE;fill(new int[0], ...)可安全执行(只要索引合法) - 多线程环境下共享数组时,
fill()本身非原子操作,不保证整个区间填充的可见性或原子性,需配合同步机制
替代方案与何时不用 fill
并非所有场景都适合 Arrays.fill():
- 需要按规则生成不同值(如递增序列、随机数)→ 用 for 或 Stream.iterate
- 填充目标是集合(List)而非数组 → 用
Collections.nCopies()或list.replaceAll() - 初始化二维数组某一行 → 对
arr[i]单独调用fill(),别试图用一维接口操作二维 - 超大数组(GB 级)且只填极小片段 → 手动赋值更省内存带宽,避免 fill 内部校验开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











