java深拷贝和浅拷贝
时间: 2023-10-17 21:07:06 浏览: 79
Java 深拷贝与浅拷贝的分析
Java中的对象赋值和拷贝有两种方式:深拷贝和浅拷贝。
浅拷贝是指,仅仅拷贝对象的引用,而不是对象本身。也就是说,对于原始对象和拷贝对象来说,它们共享同一个内存地址,因此它们的改变会互相影响。
深拷贝是指,拷贝对象本身的所有内容,包括对象中的引用类型。也就是说,对于原始对象和拷贝对象来说,它们有着不同的内存地址,它们的改变不会互相影响。
Java中的浅拷贝可以使用Object类的clone()方法实现,而深拷贝需要自己实现。下面是一个深拷贝的例子:
```java
import java.io.*;
public class DeepCopy implements Serializable {
private String name;
private int age;
private Person person;
public DeepCopy(String name, int age, Person person) {
this.name = name;
this.age = age;
this.person = person;
}
public DeepCopy 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 (DeepCopy) ois.readObject();
}
public static void main(String[] args) {
Person person = new Person("Tom");
DeepCopy original = new DeepCopy("David", 20, person);
try {
DeepCopy copy = original.deepCopy();
System.out.println("original == copy? " + (original == copy)); // false
System.out.println("original.person == copy.person? " + (original.person == copy.person)); // false
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Person implements Serializable {
private String name;
public Person(String name) {
this.name = name;
}
}
```
在这个例子中,DeepCopy类包含了一个Person类的引用类型。在deepCopy()方法中,我们将对象序列化成字节流,然后再将字节流反序列化成对象,这样就实现了深拷贝。在main()方法中,我们分别创建了原始对象和拷贝对象,并且打印了它们的地址和对象中引用类型的地址,可以看到它们都是不同的。
阅读全文