System.arraycopy在对象数组中默认执行浅拷贝,仅复制引用而非对象本身;因对象数组存储的是引用,复制后新旧数组指向同一对象,修改对象状态双方可见,但替换引用仅影响当前数组。

System.arraycopy 在对象数组中默认就是浅拷贝,不需要额外操作 —— 它只复制数组中每个元素的引用,不复制对象本身。
为什么是浅拷贝?
对象数组(如 String[]、MyClass[])里存的其实是对象的引用(内存地址)。arraycopy 逐个把引用值从源数组复制到目标数组,新数组和原数组指向同一组对象。修改某个对象的状态,两边都能看到;但替换数组中的某个引用(比如 arr[0] = new Obj()),只影响当前数组。
基本用法示例
确保目标数组已创建且长度足够,否则会抛 ArrayStoreException 或 IndexOutOfBoundsException:
String[] src = {"a", "b", "c"};
String[] dst = new String[3];
System.arraycopy(src, 0, dst, 0, src.length);
// dst 和 src 的每个元素引用相同 String 对象
关键注意事项
- 目标数组必须预先分配,不能为
null - 源和目标数组类型需兼容(如都为
Object[]或同子类数组) - 起始索引和长度不能越界,否则抛
ArrayIndexOutOfBoundsException - 若源数组含
null,复制后目标对应位置也是null(仍是浅拷贝语义)
和深拷贝的区别
如果需要深拷贝(即复制对象本身),arraycopy 不行,得手动遍历并调用 clone()、序列化或构造新对象。例如:
立即学习“Java免费学习笔记(深入)”;
// 浅拷贝(arraycopy 默认行为)
System.arraycopy(src, 0, dst, 0, len);
// 深拷贝示意(需类支持 clone)
for (int i = 0; i < src.length; i++) {
dst[i] = src[i].clone(); // 前提:对象实现 Cloneable 且重写 clone()
}


















