system.arraycopy是java中高效复制数组元素的底层方法,支持同一数组内偏移复制(即“移动”),自动按方向安全处理重叠区域,参数为src、srcpos、dest、destpos、length,需确保索引和长度非负且不越界。

System.arraycopy 是 Java 中高效复制数组元素的底层方法,它能直接在内存层面完成数据搬移,比手动循环快得多,也比 Arrays.copyOf 更灵活——尤其适合“移动”(即同一数组内偏移复制)场景。
什么时候算“移动”?关键看 src 和 dest 是不是同一个数组
所谓“移动”,并不是物理上搬走元素,而是通过 arraycopy 把某段数据复制到同一数组的另一位置。这常用于:
- 删除中间元素后,把后面的元素前移(如模拟 ArrayList 的 remove)
- 在指定位置插入新元素,先腾出空位(后移部分元素)
- 旋转、翻转、截断等原地数组变换
只要 srcArray == destArray,且复制区间有重叠,就属于“移动”。此时 method 会自动按方向(左移/右移)安全处理,避免覆盖问题。
参数含义必须记清:5 个参数缺一不可
调用形式:System.arraycopy(src, srcPos, dest, destPos, length)
- src:源数组(可与 dest 相同)
- srcPos:从源数组哪个索引开始取(包含)
- dest:目标数组
- destPos:复制到目标数组哪个索引开始放(包含)
- length:要复制多少个元素(不是结束索引!)
⚠️ 注意:所有索引和长度都要求非负,且不能越界,否则抛 ArrayIndexOutOfBoundsException。JVM 不做范围校验优化,出错时会明确提示哪一项超限。
同一数组内移动:左移和右移的写法差异
假设有一个数组 int[] a = {1,2,3,4,5};,想把索引 2 开始的 2 个元素(即 3,4)移到索引 1 的位置(覆盖掉原 2),结果变成 {1,3,4,4,5}:
System.arraycopy(a, 2, a, 1, 2); // ✅ 正确:右移式覆盖,自动从后往前复制
如果反过来,想把索引 1~2 的元素(2,3)左移到索引 0,即变成 {2,3,3,4,5}:
System.arraycopy(a, 1, a, 0, 2); // ✅ 正确:左移式覆盖,自动从前往后复制
原理:JVM 内部会判断 srcPos (可能覆盖前面)就从后往前拷;<code>srcPos > destPos(可能覆盖后面)就从前往后拷。你不用手动拆循环,放心交给它。
常见错误与规避建议
- 混淆
length和“结束索引”:写成arraycopy(a, 0, b, 0, a.length-1)会少拷最后一个元素 - 目标数组太小:即使只是移动,
destPos + length也不能超过dest.length - 类型不匹配:src 和 dest 元素类型必须兼容(如 Object[] 可拷到 String[]?不行,会抛
ArrayStoreException) - 用 null 数组:任一数组为 null,直接抛
NullPointerException
建议封装工具方法时加简单校验,比如检查 src != null && dest != null && length >= 0,再调用 native 方法,更健壮。











