当前位置: 首页 > news >正文

浅拷贝与深拷贝的区别

浅拷贝和深拷贝是两种不同的对象复制方式,主要区别在于它们如何处理对象内部的引用类型字段。


浅拷贝 (Shallow Copy)

特点

  • 只复制对象本身(基本类型字段)和对象中的引用(地址)

  • 不复制引用指向的实际对象

  • 原始对象和拷贝对象共享内部引用对象

示例

class Person {String name;Address address; // 引用类型// 浅拷贝方法public Person shallowCopy() {Person copy = new Person();copy.name = this.name;       // 基本类型或String的复制copy.address = this.address;  // 只是复制引用return copy;}
}

结果

  • 修改拷贝对象的address会影响原始对象,因为它们引用同一个Address对象

深拷贝 (Deep Copy)

特点

  • 复制对象本身及其所有引用的对象

  • 递归复制所有引用对象直到基本类型

  • 原始对象和拷贝对象完全独立,不共享任何引用

示例

class Person {String name;Address address;// 深拷贝方法public Person deepCopy() {Person copy = new Person();copy.name = this.name;copy.address = new Address(this.address.street, this.address.city); // 创建新对象return copy;}
}

结果

  • 修改拷贝对象的address不会影响原始对象,因为它们引用不同的Address对象


对比表格

特性浅拷贝深拷贝
复制内容对象本身和引用地址对象本身和所有引用对象
内存消耗较少较多
性能较快较慢
独立性不独立(共享引用对象)完全独立
实现复杂度简单复杂(需要递归复制所有引用对象)

实际应用场景

  • 使用浅拷贝

    • 当对象内部引用是不可变的(如String)

    • 当明确需要共享某些引用对象时

    • 性能要求高且不需要完全独立的对象时

  • 使用深拷贝

    • 需要完全独立的对象副本时

    • 当对象包含可变引用对象且不希望共享时

    • 在多线程环境中需要安全地共享数据时

Java中的实现方式

  1. 浅拷贝:

    • 实现Cloneable接口并重写clone()方法

    • 手动复制字段

  2. 深拷贝:

    • 递归实现clone()方法

    • 使用序列化和反序列化

    • 使用第三方库如Apache Commons Lang的SerializationUtils.clone()

    • 使用复制构造函数或工厂方法


// 使用序列化实现深拷贝
public static <T extends Serializable> T deepCopy(T object) {try {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(object);ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);return (T) ois.readObject();} catch (Exception e) {throw new RuntimeException(e);}
}
http://www.lryc.cn/news/608559.html

相关文章:

  • 技术面试知识点详解 - 从电路到编程的全栈面经
  • 机试备考笔记 2/31
  • linux编译基础知识-头文件标准路径
  • 系统思考:超越线性分析
  • SpringBoot相关注解
  • MybatisPlus-逻辑删除
  • c++之基础B(进制转换)(第三课)
  • ARP协议是什么?ARP欺骗是如何实现的?我们该如何预防ARP欺骗?
  • 存储过程的介绍、基本语法、delimiter的使用
  • HarmonyOS 开发:基于 ArkUI 实现复杂表单验证的最佳实践
  • Makefile 从入门到精通:自动化构建的艺术
  • 【设计模式】 3.设计模式基本原则
  • Kotlin单例模式懒汉模式:LazyThreadSafetyMode.SYNCHRONIZED(2)
  • 未来交通:元宇宙技术重塑出行体验
  • 第15届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2024年1月28日真题
  • 深入 Go 底层原理(二):Channel 的实现剖析
  • 网易云音乐硬刚腾讯系!起诉SM娱乐滥用市场支配地位
  • Seal Report:一款免费开源的报表工具
  • 联合索引全解析:一棵树,撑起查询的半边天
  • TCL --- 列表_part2
  • 逻辑回归 银行贷款资格判断案列优化 交叉验证,调整阈值,下采样与过采样方法
  • Conda和pip的使用记录
  • Python 字典为什么查询高效
  • Python 全局解释器锁
  • 如何在`<link type=“icon“ href=`的`href`中写SVG并使用path标签? 笔记250802
  • C++:std::array vs 原生数组 vs std::vector
  • 通俗易懂解释Java8 HashMap
  • 计数组合学7.11(RSK算法)
  • 人工智能与农业:智慧农业的发展与未来
  • 数据集-目标检测系列- 地球仪 数据集 globe>> DataBall