找回密码
 立即注册
查看: 346|回复: 0

[其它] Java 对象拷贝 - 浅拷贝与深拷贝的差异与应用

[复制链接]

279

主题

0

回帖

964

积分

超级版主

积分
964
发表于 2024-7-8 11:50:47 | 显示全部楼层 |阅读模式
本帖最后由 Shaw0xyz 于 2024-7-8 12:16 编辑

1. 引言

java编程中,对象拷贝是一项常见操作。根据拷贝的深度不同,可以分为浅拷贝和深拷贝。理解这两种拷贝方式的差异及其应用场景,对于编写高效、安全的代码非常重要。本文将详细介绍Java中的浅拷贝与深拷贝,并通过示例代码说明它们的差异与应用。

2. 浅拷贝

2.1 浅拷贝的定义

浅拷贝是指创建一个新对象,这个新对象的属性与原对象的属性完全相同,但如果属性是对象类型,则拷贝的是引用而非对象本身。换句话说,浅拷贝只拷贝对象的一层。

2.2 浅拷贝的实现

浅拷贝通常通过实现Cloneable接口并覆盖clone方法来实现。

  1. public class Person implements Cloneable {
  2.     private String name;
  3.     private int age;
  4.     private Address address;

  5.     public Person(String name, int age, Address address) {
  6.         this.name = name;
  7.         this.age = age;
  8.         this.address = address;
  9.     }

  10.     @Override
  11.     protected Object clone() throws CloneNotSupportedException {
  12.         return super.clone();
  13.     }

  14.     // getters and setters
  15. }

  16. class Address {
  17.     private String city;
  18.     private String street;

  19.     public Address(String city, String street) {
  20.         this.city = city;
  21.         this.street = street;
  22.     }

  23.     // getters and setters
  24. }
复制代码


2.3 浅拷贝的应用场景

浅拷贝适用于对象较为简单,且没有嵌套引用的情况。例如,在需要快速复制对象,且对嵌套对象的修改不会影响其他对象时,可以使用浅拷贝。

3. 深拷贝

3.1 深拷贝的定义

深拷贝是指创建一个新对象,并递归复制所有属性,包括所有嵌套对象。这样新对象与原对象完全独立,互不影响。

3.2 深拷贝的实现

深拷贝可以通过多种方式实现,包括实现Cloneable接口、序列化等。

3.2.1 通过Cloneable接口实现深拷贝

  1. public class Person implements Cloneable {
  2.     private String name;
  3.     private int age;
  4.     private Address address;

  5.     public Person(String name, int age, Address address) {
  6.         this.name = name;
  7.         this.age = age;
  8.         this.address = address;
  9.     }

  10.     @Override
  11.     protected Object clone() throws CloneNotSupportedException {
  12.         Person cloned = (Person) super.clone();
  13.         cloned.address = (Address) address.clone();
  14.         return cloned;
  15.     }

  16.     // getters and setters
  17. }

  18. class Address implements Cloneable {
  19.     private String city;
  20.     private String street;

  21.     public Address(String city, String street) {
  22.         this.city = city;
  23.         this.street = street;
  24.     }

  25.     @Override
  26.     protected Object clone() throws CloneNotSupportedException {
  27.         return super.clone();
  28.     }

  29.     // getters and setters
  30. }
复制代码


3.2.2 通过序列化实现深拷贝

  1. import java.io.*;

  2. public class Person implements Serializable {
  3.     private String name;
  4.     private int age;
  5.     private Address address;

  6.     public Person(String name, int age, Address address) {
  7.         this.name = name;
  8.         this.age = age;
  9.         this.address = address;
  10.     }

  11.     public Person deepCopy() throws IOException, ClassNotFoundException {
  12.         ByteArrayOutputStream bos = new ByteArrayOutputStream();
  13.         ObjectOutputStream oos = new ObjectOutputStream(bos);
  14.         oos.writeObject(this);

  15.         ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
  16.         ObjectInputStream ois = new ObjectInputStream(bis);
  17.         return (Person) ois.readObject();
  18.     }

  19.     // getters and setters
  20. }

  21. class Address implements Serializable {
  22.     private String city;
  23.     private String street;

  24.     public Address(String city, String street) {
  25.         this.city = city;
  26.         this.street = street;
  27.     }

  28.     // getters and setters
  29. }
复制代码

3.3 深拷贝的应用场景

深拷贝适用于对象结构复杂,包含多层嵌套对象的情况。尤其在多线程环境中,需要确保对象的独立性,避免因共享对象导致数据不一致时,深拷贝是一个很好的选择。

4. 浅拷贝与深拷贝的差异

4.1 拷贝内容

(1) 浅拷贝只复制对象的基本类型和引用类型,引用类型只复制引用地址。
(2) 深拷贝不仅复制对象的基本类型,还递归复制引用类型指向的对象。

4.2 内存使用

(1) 浅拷贝占用的内存较少,因为只复制基本类型和引用地址。
(2) 深拷贝占用的内存较多,因为需要复制所有嵌套对象。

4.3 性能

(1) 浅拷贝速度较快,因为复制的内容较少。
(2) 深拷贝速度较慢,因为需要递归复制所有嵌套对象。

5. 结论

浅拷贝与深拷贝各有优缺点,适用于不同的应用场景。理解它们的差异,并根据具体需求选择合适的拷贝方式,对于编写高效、安全的Java代码至关重要。希望本文能帮助读者深入理解Java对象拷贝的概念,并在实际开发中灵活应用。如果有任何问题或建议,欢迎讨论交流。








/ 荔枝学姐de课后专栏 /

Hi!这里是荔枝学姐~

欢迎来到我的课后专栏

自然语言学渣 NLP摆烂姐

热衷于技术写作 IT边角料

AIGC & Coding & linux ...

~互撩~ TG: @Shaw_0xyz
荔枝学姐爱吃荔枝!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 13:45 , Processed in 0.060457 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表