system.arraycopy 是 java 中最底层、最高效的数组复制方式,直接调用 jvm 本地方法,需指定源数组、源起始索引、目标数组、目标起始索引和复制长度五个参数,任一越界或类型不匹配将抛出相应异常。

System.arraycopy 是 Java 中最底层、最高效的数组复制方式,它直接调用 JVM 的本地方法(native),绕过 Java 层的循环和边界检查,性能远超 Arrays.copyOf 或手动 for 循环。
核心用法:5 个参数必须记清
调用格式固定:System.arraycopy(src, srcPos, dest, destPos, length)
- src:源数组(不能为 null)
- srcPos:从源数组哪个索引开始复制(>= 0)
- dest:目标数组(不能为 null,且类型必须与 src 兼容)
- destPos:复制到目标数组的起始索引(>= 0)
- length:要复制的元素个数(>= 0)
任何参数越界(如 srcPos + length > src.length)会抛 ArrayIndexOutOfBoundsException;类型不匹配则抛 ArrayStoreException。
复制场景与典型写法
✅ 完整复制(同类型)
目标数组需预先创建,长度至少等于源数组长度:
int[] a = {1, 2, 3, 4, 5};
int[] b = new int[a.length];
System.arraycopy(a, 0, b, 0, a.length); // b = [1,2,3,4,5]
✅ 部分复制(截取或偏移)
比如复制后 3 个元素到新数组前部:
int[] a = {10, 20, 30, 40, 50};
int[] b = new int[3];
System.arraycopy(a, 2, b, 0, 3); // b = [30,40,50]
✅ 同一数组内移动(如插入/删除模拟)
注意方向:向后移动用 srcPos ,需从尾部开始避免覆盖;向前移动可正序:
// 把索引 2~4 的元素前移一位(模拟删除索引 1)
int[] arr = {1, 2, 3, 4, 5};
System.arraycopy(arr, 2, arr, 1, 3); // arr = [1,3,4,5,5]
常见误区与避坑提醒
-
目标数组必须已初始化:传 null 会直接抛
NullPointerException - 不支持自动扩容:dest 长度不够时只复制能放下的部分,不会报错但会静默截断(只要不越界)
- 基本类型与对象数组都适用,但对象数组复制的是引用,不是深拷贝
-
多维数组复制需逐层调用:一维
arraycopy不会递归复制子数组
对比 Arrays.copyOf:何时选谁?
如果只是「完整复制并可能扩容」,用 Arrays.copyOf 更简洁:
int[] b = Arrays.copyOf(a, a.length * 2); // 自动新建+复制+补零
但若需要:
✔ 部分复制
✔ 同数组内位移
✔ 最大化性能(如高频循环中)
→ 直接上 System.arraycopy,它更轻量、可控性更强。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











