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

浅拷贝与深拷贝的区别

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


浅拷贝 (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.xdnf.cn/news/16830.html

相关文章:

  • Vue 响应式基础全解析2
  • Python Pandas.unique函数解析与实战教程
  • 24黑马SpringCloud的Docker本地目录挂载出现相关问题解决
  • 《JMM 与 happens-before 原则:并发编程的核心内存语义》
  • 网络常识-子网掩码
  • 暑期算法训练.13
  • stm32F407 实现有感BLDC 六步换相 cubemx配置及源代码(二)
  • 电脑系统中的BCD
  • 排序算法-堆排序
  • ARMv8/v9架构FAR_EL3寄存器介绍
  • Android 13/14/15 默认授权应用权限的实现方法
  • 《深潜React列表渲染:调和算法与虚拟DOM Diff的优化深解》
  • 开疆智能Profinet转Modbus网关连接信捷PLC从站配置案例
  • WPFC#超市管理系统(4)入库管理
  • oect刷入arm系统安装docker
  • 【Redis数据结构详解】特点、用途与实际应用
  • CCF IVC 2025“汽车安全攻防赛” -- Crypto -- WriteUp
  • VAST视频广告技术实现:从零开始搭建视频广告投放系统
  • 文件同步神器-rsync命令讲解
  • linux编译基础知识-库文件标准路径
  • Oracle 11g RAC集群部署手册(一)
  • imx6ull-驱动开发篇6——Linux 设备树语法
  • K8S部署ELK(二):部署Kafka消息队列
  • NVIDIA GPU架构
  • 四、Portainer图形化管理实战与Docker镜像原理
  • express-jwt报错:Error: algorithms should be set
  • Ubuntu系统VScode实现opencv(c++)视频及摄像头使用
  • [硬件电路-112]:模拟电路 - 信号处理电路 - 二极管的应用 - 峰值检测电路与波形展示
  • 【网络与爬虫 37】ScrapeFly深度解析:云端爬虫革命,告别复杂部署拥抱一键API
  • C++入门自学Day5-- c++类与对象(面试题)