java浅复制和深复制是什么,列出他们的区别
时间: 2023-06-02 12:07:04 浏览: 79
Java中的浅复制和深复制是用来复制对象的两种不同方式。浅复制只复制对象本身,而不复制对象所包含的引用类型变量;而深复制会复制对象及其所包含的所有引用类型变量。
具体来说,浅复制是指将已有对象的所有非静态字段复制到新的对象中,如下所示:
```
public class MyClass implements Cloneable {
private int num;
private String str;
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
MyClass obj1 = new MyClass();
MyClass obj2 = (MyClass) obj1.clone(); // 浅复制
```
在进行浅复制时,`obj2` 会复制 `obj1` 的字段,但不会复制 `obj1` 所引用的其他对象。如果 `obj1` 包含了某些复杂对象,例如数组或集合等,那么在复制后,`obj2` 中的引用仍然指向 `obj1` 中的同一个对象。
相比之下,深复制会复制对象及其所有引用类型变量。以下是一个使用深复制的示例:
```
import java.io.*;
public class MyClass implements Serializable {
private int num;
private String str;
public Object 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 ois.readObject();
}
}
MyClass obj1 = new MyClass();
MyClass obj2 = (MyClass) obj1.deepClone(); // 深复制
```
在进行深复制时,`obj2` 会复制整个对象树,即使 `obj1` 包含了某些复杂对象,也会新建一个拷贝,并在 `obj2` 中使用该拷贝。
总的来说,深复制比浅复制更花费内存和时间,但可以避免由于对象共享所带来的问题。