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

Java深拷贝与浅拷贝核心解析

Java深拷贝与浅拷贝的概念

浅拷贝(Shallow Copy)只复制对象的引用,而不复制对象本身。拷贝后的对象和原对象共享同一块内存地址中的子对象。修改其中一个对象的非基本类型属性时,另一个对象的对应属性也会被修改。

深拷贝(Deep Copy)会复制对象及其所有子对象,生成一个完全独立的新对象。拷贝后的对象和原对象完全分离,修改其中一个对象的属性不会影响另一个对象。

内存分析示例

假设有一个Person类,包含nameString)和addressAddress类)属性:

class Address {String city;// 构造方法、getter/setter省略
}class Person implements Cloneable {String name;Address address;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 默认浅拷贝}
}

浅拷贝实现与内存表现

Person p1 = new Person();
p1.name = "Alice";
p1.address = new Address("Beijing");Person p2 = (Person)p1.clone();

内存表现:

  • p1p2是两个独立对象,但它们的address属性指向同一个Address对象
  • 修改p2.address.city会影响p1.address.city

深拷贝实现方式

方法1:重写clone()
@Override
protected Object clone() throws CloneNotSupportedException {Person cloned = (Person)super.clone();cloned.address = (Address)this.address.clone(); // 递归克隆引用对象return cloned;
}

方法2:序列化实现
public Person deepCopy() throws IOException, ClassNotFoundException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (Person)ois.readObject();
}

内存表现:

  • p1p2完全独立,包括所有引用类型属性
  • 修改p2.address.city不会影响p1.address.city

性能与适用场景

浅拷贝:

  • 性能更好,仅复制引用
  • 适合引用对象不可变或不需要独立修改的场景

深拷贝:

  • 性能开销较大,需要递归复制所有对象
  • 适合需要完全独立对象的场景,如多线程环境

注意事项

  1. String等不可变对象在浅拷贝中是安全的
  2. 数组的clone()方法是浅拷贝
  3. 深拷贝可能导致循环引用问题
  4. 使用第三方库(如Apache Commons Lang的SerializationUtils)可以简化深拷贝实现
http://www.xdnf.cn/news/1392211.html

相关文章:

  • 设计模式:装饰模式(Decorator Pattern)
  • Kubernetes 与 GitOps 的深度融合实践指南
  • 【3D入门-指标篇上】3D 网格重建评估指标详解与通俗比喻
  • 3D 数字孪生可视化技术在学校项目中的应用
  • “破译”的密钥/算法类型
  • 【工具】开源大屏设计器 自用整理
  • LeetCode第二题知识点2 ---- 栈、堆、地址
  • LeetCode - 128. 最长连续序列
  • Vue3+Ant-design-vue 实现树形穿梭框
  • BlueKing-ci
  • 币安创始人赵长鹏:香港需要更广泛的加密货币产品来与美国和阿联酋竞争
  • docker-相关笔记
  • Cesium 入门教程(十三):粒子系统实例
  • 2025年03月 Scratch 图形化(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • springboot中循环依赖的解决方法-使用反射
  • mysql双机热备(主主模式)
  • Java项目实现【记录系统操作日志】功能
  • 基于FPGA的DDR3读写实验学习
  • 《ArkUI 记账本开发:状态管理与数据持久化实现》
  • el-table合并列实例
  • 光谱相机多层镀膜技术如何提高透过率
  • (二)Python语法基础(下)
  • 响应式编程框架Reactor【2】
  • Redis开发06:使用stackexchange.redis库结合WebAPI对redis进行增删改查
  • Vue3 全面介绍
  • 技术SEO修复ROI最大化:有限资源下的优先排序策略
  • 【笔记】Linux高性能网络详解之DPDK
  • uni-app 常用钩子函数:从场景到实战,掌握开发核心
  • 算法题打卡力扣第169题:多数元素(easy)
  • 单点登录(SSO)前端(Vue2.X)改造