当前位置: 首页 > 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.dtcms.com/a/312162.html

相关文章:

  • 断路器瞬时跳闸曲线数据获取方式
  • 关于Sort的补充
  • SpringBoot 02 AOP
  • 王者荣耀模拟器:一款基于Python的文本角色扮演游戏
  • 译| Netflix内容推荐模型的一些改进方向
  • 测试时扩散的深度研究助手
  • Redis实战(6)-- 慢查询运用与理解
  • 图像加密学习日志————论文学习DAY4
  • 档案馆可视化:历史宝库的数字新貌
  • 使用 MySQL Shell 进行 MySQL 单机到 InnoDB Cluster 的数据迁移实践
  • 【Django】-5- ORM的其他用法
  • RAWINPUT避坑指南(涉及GetRawInputData/GetRawInputBuffer)
  • 详解Python标准库之命令行界面库
  • .env 文件
  • WinMerge:文件对比工具,支持各种格式文件对比,永久免费使用!
  • 软件交付终极闸口:验收测试全解析
  • GCC(GNU Compiler Collection)与人工智能实例
  • 基于深度学习的医学图像分析:使用MobileNet实现医学图像分类
  • 第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2022年12月18日真题
  • 【Linux】Linux编译器-gcc/g++使用
  • 广东省省考备考(第六十四天8.2)——判断推理(重点回顾)
  • 【领域热点】人工智能与大模型应用:开启软件领域新革命
  • 无法连接到 Google Container Registry (GCR)** 导致的镜像拉取失败
  • 数据结构与算法:字符串哈希
  • C# 中抽象类、密封类、静态类和接口的区别
  • 数据处理和统计分析——09 数据分组
  • 【0基础PS】PS工具详解--图案图章工具
  • 洛谷刷题8.2
  • 基于LevitUnet的超声图像分割
  • 紧急救援!Oracle RAC节点驱逐元凶:私网Packet Reassembles Failed“包重组失败”一招救命