基本类型数组拷贝后完全独立,对象数组默认只拷贝引用;基本类型复制数值,修改互不影响,多余位置按默认值填充;对象数组浅拷贝共享堆中对象,需手动深拷贝或序列化实现真正隔离。

Java 中基本数据类型数组和对象数组的拷贝行为本质不同,关键在于“值”与“引用”的处理逻辑。基本类型数组拷贝后完全独立;对象数组拷贝后默认共享对象实例——除非额外做深拷贝。
基本数据类型数组:拷贝即隔离
int、double、boolean 等基本类型数组在使用 clone()、Arrays.copyOf() 或 System.arraycopy() 时,复制的是每个元素的实际数值。新旧数组内存完全分离。
- 修改拷贝数组任意元素,原数组不受影响
- 即使目标数组长度大于源数组,多余位置按类型默认值填充(如 int 填 0)
- 无需实现 Cloneable 接口,直接可用
对象数组:默认只拷贝引用
String[]、Person[] 这类对象数组,上述方法执行的仍是浅拷贝:只复制数组中每个元素的引用地址,不复制引用指向的对象本身。
- newArr[i] 和 oldArr[i] 指向同一个堆中对象
- 修改 newArr[0].name,oldArr[0].name 同步变化
- String 是特例:因不可变(immutable),表现像值类型,但底层仍是引用拷贝
如何真正实现对象数组的独立拷贝
要让对象数组拷贝后互不影响,必须对每个对象单独深拷贝。常见方式有:
- 手动循环 + 对象 clone():要求对象类实现 Cloneable 并重写 clone()
- 手动循环 + 构造新对象:用原对象字段构造新实例(推荐,更可控)
- 序列化反序列化:适用于可序列化的类,通用但有性能和限制成本
- 第三方库(如 Apache Commons Lang 的 SerializationUtils):简化调用
别踩坑:这些不是深拷贝
以下操作对对象数组都只完成浅拷贝,容易误以为已隔离:
- arr2 = arr1.clone() —— 数组引用变了,但内部对象还是同一份
- arr2 = Arrays.copyOf(arr1, arr1.length)
- System.arraycopy(arr1, 0, arr2, 0, len)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











