Java 基本数据类型数组与对象数组拷贝差异
同样是拷贝,数组的行为却可能大相径庭。有经验的开发者都知道:基本数据类型数组拷贝后完全独立,而对象数组默认只拷贝引用,两者互不影响?想得美。基本类型复制数值,修改互不干扰,多余位置按默认值填充;但对象数组的浅拷贝,其实是共享堆中对象,若要真正隔离,得手动深拷贝或序列化。 Ja va中基本数据类型数组
同样是拷贝,数组的行为却可能大相径庭。有经验的开发者都知道:基本数据类型数组拷贝后完全独立,而对象数组默认只拷贝引用,两者互不影响?想得美。基本类型复制数值,修改互不干扰,多余位置按默认值填充;但对象数组的浅拷贝,其实是共享堆中对象,若要真正隔离,得手动深拷贝或序列化。

Ja va中基本数据类型数组和对象数组的拷贝行为,本质区别就在于“值”与“引用”的处理逻辑。基本类型数组拷贝后完全独立;对象数组拷贝后默认共享对象实例——除非额外做深拷贝。
基本数据类型数组:拷贝即隔离
int、double、boolean这类基本类型数组,在使用 clone()、Arrays.copyOf() 或 System.arraycopy() 时,复制的是每个元素的实际数值。新旧数组内存完全分离,各玩各的。
- 修改拷贝数组任意元素,原数组纹丝不动
- 目标数组长度大于源数组时,多余位置按类型默认值填充(比如 int 填 0,boolean 填 false)
- 不需要实现 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)
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















