system.arraycopy是jvm底层优化的高效数组复制方法,支持指定源/目标起始位置和长度,不创建新数组;需确保数组非空、类型一致、目标容量足够,且原地复制时避免逻辑覆盖错误。

System.arraycopy 是 Java 中高效复制数组片段的核心方法,它由 JVM 底层直接支持(通常编译为机器码级别的内存拷贝),比手动 for 循环快得多,也比 Arrays.copyOfRange 更灵活——因为它允许你指定源数组的起始位置、目标数组的写入位置以及复制长度,且不创建新数组。
关键参数含义要记牢
调用格式:System.arraycopy(src, srcPos, dest, destPos, length)
- src:源数组(不能为空)
- srcPos:从源数组哪个索引开始复制(含,从 0 开始)
- dest:目标数组(必须已存在,且足够容纳数据)
- destPos:往目标数组哪个索引开始写入(含)
- length:要复制多少个元素(不能超过源数组剩余长度,也不能导致目标越界)
复制子数组到新数组(最常用场景)
你想提取原数组的第 2 到第 5 个元素(即索引 1~4,共 4 个),生成一个新数组:
int[] original = {10, 20, 30, 40, 50, 60};
int[] sub = new int[4]; // 提前分配好目标数组
System.arraycopy(original, 1, sub, 0, 4); // 从 original[1] 开始,复制 4 个,写入 sub[0] 起
// sub 现在是 {20, 30, 40, 50}
⚠️ 注意:目标数组必须预先创建,且 dest.length ≥ destPos + length,否则抛 ArrayStoreException 或 IndexOutOfBoundsException。
原地复制(移动/覆盖部分元素)
适合实现数组“左移”、“右移”或插入操作。例如把索引 2 后面的元素整体前移一位(模拟删除索引 1 的元素):
char[] arr = {'a', 'b', 'c', 'd', 'e'};
// 删除索引 1 的 'b':把 [2]~[4] 复制到 [1]~[3]
System.arraycopy(arr, 2, arr, 1, 3); // length=3,因为从索引2复制3个:c,d,e → 放到索引1,2,3
// arr 变成 {'a', 'c', 'd', 'e', 'e'}(末尾残留需手动处理)
✅ 这种操作要求源和目标是同一数组时,必须确保不发生“覆盖未读取数据”的情况。JVM 会自动处理重叠区域(类似 memmove),但逻辑上仍需你保证 srcPos 和 destPos 的相对关系合理。
类型安全与常见坑
- 源和目标数组必须是**同类型**(如都是
String[]),否则运行时报ArrayStoreException - 不支持基本类型与包装类互转(比如不能把
int[]复制到Integer[]) - 如果任一数组为
null,立即抛NullPointerException - 长度为负数 →
IllegalArgumentException;越界 →IndexOutOfBoundsException
想省事复制一段并返回新数组?直接用 Arrays.copyOfRange(original, from, to)(内部其实就封装了 arraycopy),更简洁安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











