用java实现深拷贝
时间: 2023-07-19 18:13:29 浏览: 86
在 Java 中,实现深拷贝可以使用序列化和反序列化的方式。具体实现步骤如下:
1. 定义需要深拷贝的类,实现 Serializable 接口。
```java
public class Person implements Serializable {
private String name;
private int age;
private List<String> hobbies;
// 省略构造函数和 getter/setter 方法
}
```
2. 创建一个 ByteArrayOutputStream 对象和 ObjectOutputStream 对象,将对象写入 ByteArrayOutputStream。
```java
Person person = new Person("Tom", 18, new ArrayList<>(Arrays.asList("reading", "swimming")));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(person);
```
3. 从 ByteArrayOutputStream 中读取数据,创建新对象。
```java
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Person clone = (Person) ois.readObject();
```
完整的代码如下:
```java
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class DeepCopyDemo {
public static void main(String[] args) throws Exception {
Person person = new Person("Tom", 18, new ArrayList<>(Arrays.asList("reading", "swimming")));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(person);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Person clone = (Person) ois.readObject();
System.out.println("原始对象:" + person);
System.out.println("克隆对象:" + clone);
System.out.println("原始对象和克隆对象是否相同:" + (person == clone));
System.out.println("原始对象和克隆对象中的 List 是否相同:" + (person.getHobbies() == clone.getHobbies()));
}
}
class Person implements Serializable {
private String name;
private int age;
private List<String> hobbies;
public Person(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
// 省略 getter/setter 方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", hobbies=" + hobbies +
'}';
}
}
```
输出结果如下:
```
原始对象:Person{name='Tom', age=18, hobbies=[reading, swimming]}
克隆对象:Person{name='Tom', age=18, hobbies=[reading, swimming]}
原始对象和克隆对象是否相同:false
原始对象和克隆对象中的 List 是否相同:false
```
可见,通过深拷贝实现的克隆对象和原始对象是不同的,且克隆对象中的 List 也是新创建的对象,与原始对象中的 List 不同。
阅读全文