java浅拷贝与深拷贝示例,简单易懂
时间: 2024-10-11 07:13:25 浏览: 34
js对象浅拷贝和深拷贝详解
在Java中,浅拷贝和深拷贝是用来复制对象时的不同策略。当创建新对象并从已有对象派生而来的过程称为复制。
**浅拷贝**:浅拷贝只复制了引用的对象,即两个对象共享相同的底层数据结构。如果原始对象包含的是基本类型或不可变对象,浅拷贝不会有问题。但是,如果对象内部有其他对象,那么对这些对象的修改会反映到原对象上,因为它们实际上是同一个引用。
下面是一个简单的浅拷贝示例:
```java
class Person {
String name;
int age;
// 浅拷贝构造函数
public Person(Person original) {
this.name = original.name;
this.age = original.age; // 只复制了引用,不是副本
}
}
Person personA = new Person("Alice", 20);
Person personB = new Person(personA); // 浅拷贝
personB.name = "Bob"; // 修改personB会影响personA
// 输出:personA的name仍为"Bob"
```
**深拷贝**:深拷贝则是完全独立的复制整个对象,包括所有嵌套的对象。这意味着每个对象都有自己的内存空间。Java中没有内置的深拷贝机制,通常通过序列化反序列化或者第三方库如Cloneable接口配合Object.clone()实现。
下面是深拷贝的一个示例,假设有一个复杂的对象Person包含了一个地址 Address:
```java
import java.io.Serializable;
class Address implements Serializable {
//...
}
class Person {
String name;
Address address;
// 使用序列化实现深拷贝
public Person deepCopy() throws Exception {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(this);
objectOutputStream.close();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
return (Person) objectInputStream.readObject();
}
}
// 使用深拷贝
Person personA = new Person("Alice", new Address(...));
Person personB = personA.deepCopy(); // 深拷贝,修改personB不影响personA
```
阅读全文