java中深拷贝与浅拷贝
时间: 2023-11-02 12:06:47 浏览: 98
在Java中,拷贝是指复制一个对象的值到另一个对象中。深拷贝和浅拷贝是两种不同的拷贝方式。
浅拷贝是指在拷贝对象时,只复制对象本身和对象内部的基本数据类型,而不复制对象内部的引用类型。也就是说,新对象和原对象会共享引用类型的数据。如果修改了引用类型的数据,原对象和新对象都会受到影响。
深拷贝是指在拷贝对象时,不仅复制对象本身和对象内部的基本数据类型,还会复制对象内部的引用类型。也就是说,创建了一个新的独立的对象,新对象和原对象之间没有任何关联。修改新对象的数据不会影响原对象。
实现深拷贝和浅拷贝可以通过以下方式:
1. 浅拷贝:使用`clone()`方法进行浅拷贝。需要实现`Cloneable`接口,并重写`clone()`方法。示例代码如下:
```java
class MyClass implements Cloneable {
private int value;
private MyObject obj;
public MyClass(int value, MyObject obj) {
this.value = value;
this.obj = obj;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
```
2. 深拷贝:通过序列化和反序列化实现深拷贝。将对象写入流中,然后再从流中读取出来,实现对象的拷贝。示例代码如下:
```java
import java.io.*;
class MyClass implements Serializable {
private int value;
private MyObject obj;
public MyClass(int value, MyObject obj) {
this.value = value;
this.obj = obj;
}
public Object deepCopy() 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 ois.readObject();
}
}
```
需要注意的是,要实现深拷贝,对象及其引用类型都需要实现`Serializable`接口。
阅读全文