深拷贝浅拷贝
时间: 2025-05-10 19:30:12 浏览: 23
### 深拷贝与浅拷贝的区别及用法
#### 基本概念
在编程领域,特别是面向对象的语言中,深拷贝和浅拷贝是两种不同的数据结构复制方法。它们的主要差异在于如何处理嵌套的对象或引用类型的变量。
- **浅拷贝**是指创建一个新的对象,这个新对象会存储原对象中非引用类型字段的值以及引用类型字段的引用地址[^1]。这意味着如果修改了被引用的内容,则会影响原始对象和其他通过该引用访问到的对象。
- **深拷贝**则是指完全克隆整个对象及其内部所有的子对象副本,使得源对象与其副本之间没有任何关联关系[^5]。因此,在执行任何一方上的更改都不会反映到另一方上。
#### 实现方式
##### Java 中的例子:
###### 浅拷贝示例:
```java
public class ShallowCopyExample implements Cloneable {
int value;
String text;
public Object clone() throws CloneNotSupportedException {
return super.clone(); // 默认实现的是浅拷贝
}
@Override
public String toString() {
return "ShallowCopyExample{" +
"value=" + value +
", text='" + text + '\'' +
'}';
}
}
```
上述代码展示了如何利用 `clone()` 方法来完成一个类实例的浅拷贝操作。需要注意的是,默认情况下,`Object` 类提供的 `clone()` 函数只会做一层级别的复制——即只复制当前层面上的数据成员而不会深入递归地去复制那些可能存在的复杂结构内的其他对象实例[^2]。
###### 深拷贝示例:
为了达成真正的深拷贝效果,通常有两种途径可选:一是手动编写构造函数或者工厂模式来进行逐项赋值;二是借助序列化机制自动完成这一过程。
以下是基于序列化的解决方案之一:
```java
import java.io.*;
public class DeepCopyExample implements Serializable, Cloneable {
private transient static final long serialVersionUID = 1L;
int number;
AnotherClass anotherObj;
protected DeepCopyExample deepClone() throws IOException, ClassNotFoundException{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (DeepCopyExample)ois.readObject();
}
}
class AnotherClass implements Serializable{}
```
这里采用了Java内置的标准库功能实现了完整的深拷贝逻辑。通过先将目标对象写入字节流再读取出来的方式,能够有效规避掉单纯调用 `super.clone()` 所带来的局限性问题。
#### 应用场景
- 当只需要简单地共享某些部分而不希望改变原有状态时可以选择采用浅拷贝策略;
- 如果确实存在多层级依赖关系并且要求绝对隔离的话则应该考虑运用深拷贝技术[^3]。
#### 优缺点分析
| 特性 | 浅拷贝 | 深拷贝 |
|------------|-------------------------------------|----------------------------------|
| 复制速度 | 较快 | 相对较慢 |
| 内存占用量 | 少 | 更大 |
| 数据独立性 | 不够理想 | 高度独立 |
综上所述,开发者应根据实际需求权衡选用合适的拷贝形式以达到最佳性能表现的同时满足业务逻辑的要求[^4]。
阅读全文
相关推荐


















