System.arraycopy本身不支持直接填充,需借助预填值的模板数组复制实现;用长度为2的幂(如4、8、16)的模板数组循环复制,可高效填充中等长度数组。

System.arraycopy 本身不直接支持“填充”(即用单一值重复设置数组元素),它只做**内存块复制**——把源数组某段内容,原样拷贝到目标数组的指定位置。所以想用它实现“快速填充”,得借助一个**已预先填好目标值的源数组**,再通过复制来批量覆盖。
用小数组+循环复制模拟填充
如果要填充的值是固定的(比如全填 0、-1 或某个常量),可以先准备一个短小的“模板数组”,然后多次调用 arraycopy 把它复制到目标数组的不同区域。
- 适合中等长度数组(几万以内),比 for 循环略快,尤其在 JIT 优化后
- 模板数组长度建议取 8、16、32 等 2 的幂,便于对齐和复用
- 示例:用长度为 4 的模板数组填充 1000 个元素
int[] target = new int[1000];
for (int i = 0; i int len = Math.min(template.length, target.length - i);
System.arraycopy(template, 0, target, i, len);
}
配合 Arrays.fill 实现真正意义上的填充
Java 标准库中真正为“填充”设计的是 Arrays.fill()。它底层可能用汇编或 intrinsics 优化,在大多数场景下比手动 arraycopy 更简洁、更高效。
- 填充基本类型数组:
Arrays.fill(arr, value) - 填充对象数组:
Arrays.fill(arr, obj) - 填充子区间:
Arrays.fill(arr, fromIndex, toIndex, value)
Arrays.fill(arr, 42); // 全部设为 42,一行搞定
极端性能场景:Unsafe 或 JNI(不推荐日常使用)
对纳秒级敏感的底层库(如 Netty、高性能序列化框架),有时会绕过 Java 数组边界检查,用 Unsafe.setMemory 直接写内存,或调用 JNI 的 memset。但这需要额外权限、破坏可移植性,且 JDK 9+ 对 Unsafe 限制严格。
立即学习“Java免费学习笔记(深入)”;
- 普通业务代码完全没必要碰这些
- 除非你正在写 JVM 级工具或高性能中间件
- 出错风险高,调试困难,维护成本大
为什么不能直接 arraycopy(“单个值”, …)?
因为 System.arraycopy 的签名要求源必须是数组引用,它不接受基本类型值或对象实例作为源。传入单个 int、String 等都会编译失败:
// ❌ 编译错误System.arraycopy(5, 0, arr, 0, 10);
// ✅ 必须是数组
int[] src = {5, 5, 5, 5};
System.arraycopy(src, 0, arr, 0, 4);
不复杂但容易忽略:arraycopy 是复制工具,不是填充工具;真要填充,优先选 Arrays.fill。


















