java 对象深拷贝
时间: 2023-10-22 07:26:07 浏览: 102
Java中的对象拷贝有两种方式:浅拷贝和深拷贝。
浅拷贝是指创建一个新对象,新对象中的引用类型字段仍然指向原对象中对应字段的引用。这意味着修改新对象中的引用类型字段也会影响原对象。可以通过实现 Cloneable 接口并重写 clone() 方法来实现浅拷贝。
示例代码如下:
```java
class MyClass implements Cloneable {
private int value;
private MyObject myObject;
public MyClass(int value, MyObject myObject) {
this.value = value;
this.myObject = myObject;
}
// 重写 clone() 方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class MyObject {
// ...
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
MyObject obj = new MyObject();
MyClass obj1 = new MyClass(10, obj);
// 浅拷贝
MyClass obj2 = (MyClass) obj1.clone();
// obj1 和 obj2 是两个独立的对象,但是它们的 myObject 字段引用同一个对象
System.out.println(obj1 == obj2); // false
System.out.println(obj1.myObject == obj2.myObject); // true
}
}
```
深拷贝是指创建一个新对象,同时递归地复制原对象及其引用类型字段所引用的对象。这样在修改新对象时不会影响原对象。可以通过实现 Serializable 接口并使用序列化/反序列化来实现深拷贝。
示例代码如下:
```java
import java.io.*;
class MyClass implements Serializable {
private int value;
private MyObject myObject;
public MyClass(int value, MyObject myObject) {
this.value = value;
this.myObject = myObject;
}
// 深拷贝
public MyClass deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(this);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
return (MyClass) objectInputStream.readObject();
}
}
class MyObject implements Serializable {
// ...
}
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
MyObject obj = new MyObject();
MyClass obj1 = new MyClass(10, obj);
// 深拷贝
MyClass obj2 = obj1.deepClone();
// obj1 和 obj2 是两个独立的对象,它们的 myObject 字段引用不同的对象
System.out.println(obj1 == obj2); // false
System.out.println(obj1.myObject == obj2.myObject); // false
}
}
```
上述代码中,通过使用序列化/反序列化实现了深拷贝。在 `deepClone()` 方法中,首先将对象写入字节数组输出流,然后通过字节数组输入流读取字节数组并反序列化为一个新的对象。这样就能够得到一个与原对象完全独立的新对象,包括其引用类型字段所引用的对象。
阅读全文