对象数组的深拷贝和浅拷贝核心区别在于:浅拷贝仅复制数组容器,元素对象仍共享引用;深拷贝则要求数组及每个元素对象均为全新实例。Java中浅拷贝可用clone()、System.arraycopy()或Arrays.copyOf()实现;深拷贝需手动遍历调用元素clone()、序列化或JSON反序列化,且须确保嵌套引用类型也递归复制。

对象数组的深拷贝和浅拷贝,核心区别在于:**数组本身是引用类型,而数组元素如果是对象,它们的拷贝行为取决于你如何处理每个元素的引用**。直接用 clone() 或 Arrays.copyOf() 只能复制数组容器,无法自动决定里面对象是“共享”还是“全新”。
对象数组的浅拷贝怎么做?
浅拷贝只复制数组引用,不复制元素对象。常见方式有:
-
调用
array.clone():生成新数组,但每个元素仍指向原对象(地址相同) -
System.arraycopy():同上,仅复制引用 -
Arrays.copyOf():也是浅层复制,适用于所有数组类型
例如:Person[] original = {new Person("A"), new Person("B")};Person[] shallow = original.clone();
此时 shallow[0] == original[0] 为 true,改 shallow[0].setName("X"),original[0] 名字也会变。
对象数组的深拷贝关键在哪?
深拷贝必须确保:**数组是新的 + 每个元素对象也是新的**。不能只靠数组方法,得逐个处理元素。常用方式:
-
手动遍历 + 克隆每个对象:要求每个元素类实现
Cloneable并重写clone(),再循环调用 - 使用序列化(ObjectInputStream / ObjectOutputStream):把整个数组序列化再反序列化,天然支持深拷贝(需所有元素及嵌套对象都可序列化)
-
JSON 工具(如 Jackson、Gson):先转成 JSON 字符串,再反解析为新对象数组(适合 POJO,不依赖
Cloneable)
注意:如果元素对象内部还有引用字段(比如 Person 包含 Address),仅调用 person.clone() 不够——必须保证 Address 也深拷贝,否则仍是“半深”。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
怎么判断你用的是深还是浅?
最直接的方法是测试引用是否相等:
- 检查
original[i] == copied[i]:若为 true,说明是浅拷贝(或未真正拷贝对象) - 修改
copied[i].setXXX(...)后,观察original[i]是否变化:变 → 浅;不变 → 深(前提是没其他逻辑干扰)
特别提醒:数组长度、索引位置这些基本属性不影响判断,重点永远在对象实例是否独立。
实际写法建议
推荐优先使用明确可控的方式:
- 简单结构 + 稳定类设计 → 手动 clone(配合构造器或 copy 方法)
- 嵌套复杂、不想改原有类 → 序列化或 JSON 方案(注意性能和 transient 字段)
- 避免踩坑:不要只对数组调用
clone()就认为“已深拷贝”,那只是假象
本质上,对象数组的拷贝不是“数组的事”,而是“数组里每个对象怎么复制”的事。

















