system.arraycopy是java中高效批量复制数组元素的底层方法,不创建新数组而直接内存操作,适用于扩容、删除、插入等场景,调用需严格校验五个参数合法性。

System.arraycopy 是 Java 中用于高效批量复制数组元素的底层方法,它不创建新数组,而是直接在内存中移动或复制数据块,常用于数组扩容、元素删除、插入、合并等场景。
核心用法:五个参数讲清楚
调用格式为:System.arraycopy(src, srcPos, dest, destPos, length)
- src:源数组(不能为 null)
- srcPos:源数组起始索引(从 0 开始,必须满足 0 ≤ srcPos ≤ src.length)
- dest:目标数组(不能为 null,且需有足够空间)
- destPos:目标数组起始索引(同理需保证不越界)
- length:要复制的元素个数(必须 ≥ 0,且 srcPos + length ≤ src.length,destPos + length ≤ dest.length)
任意参数不合法会抛出 NullPointerException 或 ArrayIndexOutOfBoundsException。
常见迁移场景与写法
✅ 数组扩容后迁移旧数据
比如 ArrayList 底层扩容时常用:
int[] oldArray = {1, 2, 3};
int[] newArray = new int[6]; // 扩容到6
System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); // 复制全部
✅ 删除某位置元素(左移后续元素)
删除索引为 2 的元素(假设数组长度为 5):
int[] arr = {10, 20, 30, 40, 50};
int removeIndex = 2;
System.arraycopy(arr, removeIndex + 1, arr, removeIndex, arr.length - removeIndex - 1);
// 结果:{10, 20, 40, 50, 50} → 最后一位冗余,需手动置空或截断
✅ 在指定位置插入元素(右移后续元素)
在索引 1 处插入 99:
int[] arr = {10, 20, 30, 40};
int insertIndex = 1;
// 先腾出一个位置:把 [insertIndex, len-1] 右移到 [insertIndex+1, len]
System.arraycopy(arr, insertIndex, arr, insertIndex + 1, arr.length - insertIndex - 1);
arr[insertIndex] = 99; // 再填入新值
注意事项和避坑点
- 源数组和目标数组可以是同一个数组(即“原地复制”),这是实现移动操作的关键,但要注意重叠区域的复制方向——arraycopy 总是按内存地址顺序安全处理重叠,无需手动区分 left/right shift
- 只支持同类型数组之间复制(如 int[] → int[]),不支持自动装箱/拆箱或类型转换
- 性能远高于 for 循环复制(JVM 通常内联为 native memcpy 指令),尤其在大数据量时优势明显
- 不会改变数组长度,目标数组必须预先分配好足够空间;若需要“生成新数组”,需先 new 再复制
替代方案对比(什么时候不用它)
如果只是简单复制整个数组且希望返回新数组,用 Arrays.copyOf() 更简洁:
int[] copy = Arrays.copyOf(original, original.length); // 内部仍调用 arraycopy
如果涉及对象数组且需深拷贝,arraycopy 只做浅拷贝,引用地址被复制,原对象状态仍共享,此时需自行遍历 clone 或序列化。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











