system.arraycopy可高效复制对象数组指定片段,参数为src、srcpos、dest、destpos、length,要求数组类型兼容且索引不越界,仅浅拷贝引用,不支持自动扩容或深拷贝。

System.arraycopy 可以直接复制对象数组的指定片段,它不关心数组元素是基本类型还是引用类型,只要源数组和目标数组类型兼容(同为某类对象数组),就能高效完成内存级拷贝。
核心用法:五个参数必须对齐
方法签名:System.arraycopy(src, srcPos, dest, destPos, length)
- src:源数组(不能为 null)
- srcPos:从源数组哪个索引开始复制(>= 0)
- dest:目标数组(不能为 null,且类型需与 src 兼容)
- destPos:复制到目标数组的起始索引(>= 0)
- length:要复制的元素个数(>= 0)
⚠️ 注意:如果任一索引越界(如 srcPos + length > src.length),或目标数组空间不足(destPos + length > dest.length),会抛出 ArrayIndexOutOfBoundsException。
复制对象数组片段的典型场景
比如有一个 String[] 数组,想把第 2 到第 4 个元素(索引 1~3)复制到另一个数组中:
String[] src = {"a", "b", "c", "d", "e"};
String[] dest = new String[3];
System.arraycopy(src, 1, dest, 0, 3); // 复制索引1、2、3 → "b","c","d"
// dest 现在是 ["b", "c", "d"]
这里复制的是引用,不是深拷贝——dest 中每个元素仍指向 src 中相同的 String 对象(对不可变对象无影响;若元素是可变对象,修改其状态会影响双方)。
常见易错点提醒
- 目标数组必须已初始化且长度足够,不能传 null,也不能靠 arraycopy 自动扩容
- 源和目标数组类型必须兼容:例如
Object[]可以接收String[]的复制(因 String 是 Object 子类),但反过来不行 - 若想实现深拷贝(复制对象本身而非引用),需额外遍历调用 clone() 或构造新实例,arraycopy 不负责这个
- 多维数组也是对象数组(如
String[][]),arraycopy 复制的是“外层数组的引用”,即浅拷贝二维结构
替代方案对比(按需选择)
• Arrays.copyOfRange(src, from, to):更简洁,自动创建新数组,适合“截取并新建”场景
• System.arraycopy:性能更高,适合已有目标数组、避免额外分配,或需精确控制偏移位置
两者都不做深拷贝,语义和行为一致,只是封装层级不同。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











