java 深拷贝和浅拷贝
时间: 2023-11-05 13:05:33 浏览: 97
Java 中,对象的拷贝包括浅拷贝和深拷贝两种。浅拷贝是指只拷贝原对象中的基本数据类型和原对象中引用类型变量的地址,而不拷贝引用类型变量所指向的动态分配的内存空间;深拷贝则是指在堆上开辟一个新的内存空间,将原对象的所有数据全部复制到新的空间中。
可以通过实现 Cloneable 接口并重写 Object 类中的 clone() 方法来实现浅拷贝,但这种方式只会拷贝基本数据类型和引用类型的地址,而不会拷贝引用类型变量所指向的动态分配的内存空间。
对于需要实现深拷贝的情况,可以通过以下几种方式来实现:
1. 重写 Object 类中的 clone() 方法,对于引用类型变量所指向的动态分配的内存空间,也进行一次 new 的操作,将数据全部复制到新的内存空间中。
2. 通过序列化实现深拷贝。可以将原对象序列化为二进制流,再将二进制流反序列化为一个新的对象,这样就可以实现深拷贝。
3. 通过使用第三方库实现深拷贝,例如 Apache Commons Lang 库中提供了一个 SerializationUtils 类,其中有一个 clone() 方法,可以在运行时动态地实现深拷贝。
相关问题
java深拷贝和浅拷贝
Java中的对象赋值和拷贝操作分为两种:浅拷贝和深拷贝。
浅拷贝是指将一个对象复制到另一个对象,这两个对象的引用指向同一个地址,也就是说,两个对象共享同一块内存空间。当其中一个对象修改了这块内存中的内容,另一个对象也会受到影响。Java中的默认实现是浅拷贝,可以通过实现Cloneable接口并重写clone方法来实现浅拷贝。
深拷贝是指将一个对象复制到另一个对象,这两个对象的引用指向不同的地址,也就是说,两个对象不共享内存空间。如果其中一个对象修改了这块内存中的内容,另一个对象不会受到影响。实现深拷贝的方法有很多种,比如序列化、反序列化、递归拷贝等。
例如,下面是一个浅拷贝和深拷贝的示例:
```
public class Person implements Cloneable {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Address {
private String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
// 浅拷贝示例
Person person1 = new Person("张三", new Address("北京"));
Person person2 = (Person) person1.clone();
person2.getAddress().setCity("上海");
System.out.println(person1.getAddress().getCity()); // 输出:上海
// 深拷贝示例
Person person1 = new Person("张三", new Address("北京"));
Person person2 = new Person(person1.getName(), new Address(person1.getAddress().getCity()));
person2.getAddress().setCity("上海");
System.out.println(person1.getAddress().getCity()); // 输出:北京
```
JAVA深拷贝和浅拷贝
JAVA中的深拷贝和浅拷贝是对象拷贝的两种方式。深拷贝是一个整个独立的对象拷贝,会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。要实现深拷贝,可以在拷贝构造方法中,对引用数据类型变量逐一开辟新的内存空间,创建新的对象,这样可以实现深拷贝。而对于一般的拷贝构造,则一定是浅拷贝。此外,可以通过简洁的代码实现深拷贝,但要注意的是,如果某个属性被transient修饰,那么该属性就无法被拷贝了。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [Java深入理解深拷贝和浅拷贝区别](https://blog.csdn.net/riemann_/article/details/87217229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [Java 浅拷贝和深拷贝的理解和实现方式](https://blog.csdn.net/weixin_30662011/article/details/96181137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文