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

【JAVA基础面经】深拷贝与浅拷贝

文章目录

  • 基本概念
  • 浅拷贝
  • 深拷贝
    • 重写 clone() 方法实现深拷贝
    • 使用序列化实现深拷贝
    • 使用复制构造函数或工厂方法

基本概念

  • 浅拷贝:创建一个新对象,然后将原对象的非静态字段(基本类型和引用类型)直接复制到新对象中。对于引用类型字段,复制的是引用地址,即新对象和原对象中的引用字段指向同一个实例。因此,修改其中一个对象的引用字段内容,会影响另一个对象。

  • 深拷贝:创建一个新对象,并递归地复制原对象中所有引用类型字段所引用的对象,直到所有层次都被完全复制。新对象和原对象完全独立,修改一个不会影响另一个。


浅拷贝

&emap;默认的 super.clone() 执行的是浅拷贝,此时p1 和 p2 的 address 引用指向同一个 Address 对象,因此修改 p2 的地址会影响 p1

classAddress{Stringcity;Address(Stringcity){this.city=city;}// getter/setter 省略}classPersonimplementsCloneable{Stringname;Addressaddress;Person(Stringname,Addressaddress){this.name=name;this.address=address;}@OverrideprotectedObjectclone()throwsCloneNotSupportedException{returnsuper.clone();// 浅拷贝}// getter/setter 省略}publicclassShallowCopyDemo{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{Addressaddr=newAddress("北京");Personp1=newPerson("张三",addr);Personp2=(Person)p1.clone();System.out.println(p1.address.city);// 北京System.out.println(p2.address.city);// 北京// 修改 p2 的地址p2.address.city="上海";System.out.println(p1.address.city);// 上海 → 影响原对象System.out.println(p2.address.city);// 上海}}

深拷贝

重写 clone() 方法实现深拷贝

在 clone() 方法中,不仅要调用 super.clone(),还要对引用类型字段手动进行拷贝(通常也调用其 clone() 方法,要求被引用的类也支持克隆)。

classAddressimplementsCloneable{Stringcity;Address(Stringcity){this.city=city;}@OverrideprotectedObjectclone()throwsCloneNotSupportedException{returnsuper.clone();// Address 内部只有基本类型/不可变,浅拷贝即可}}classPersonimplementsCloneable{Stringname;Addressaddress;Person(Stringname,Addressaddress){this.name=name;this.address=address;}@OverrideprotectedObjectclone()throwsCloneNotSupportedException{Personcloned=(Person)super.clone();// 浅拷贝基础字段cloned.address=(Address)address.clone();// 深拷贝 addressreturncloned;}}

使用序列化实现深拷贝

将对象写入流再从流中读出,可以自动实现深拷贝(要求所有引用类型都实现 Serializable 接口)。序列化方式的优点是不需要为每个类手动编写拷贝逻辑,但要求所有涉及类都实现 Serializable,且性能相对较低。

importjava.io.*;classAddressimplementsSerializable{Stringcity;Address(Stringcity){this.city=city;}}classPersonimplementsSerializable{Stringname;Addressaddress;Person(Stringname,Addressaddress){this.name=name;this.address=address;}// 深拷贝方法publicPersondeepCopy(){try(ByteArrayOutputStreambos=newByteArrayOutputStream();ObjectOutputStreamoos=newObjectOutputStream(bos)){oos.writeObject(this);try(ByteArrayInputStreambis=newByteArrayInputStream(bos.toByteArray());ObjectInputStreamois=newObjectInputStream(bis)){return(Person)ois.readObject();}}catch(IOException|ClassNotFoundExceptione){e.printStackTrace();returnnull;}}}

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

手动编写一个构造函数,接收同类型对象并逐一复制字段,对于引用类型也递归复制。这种方式清晰直观,但需要为每个类编写拷贝逻辑,且当对象图复杂时容易遗漏。

classAddress{Stringcity;Address(Stringcity){this.city=city;}// 复制构造函数Address(Addressother){this.city=other.city;}}classPerson{Stringname;Addressaddress;Person(Stringname,Addressaddress){this.name=name;this.address=address;}// 复制构造函数(深拷贝)Person(Personother){this.name=other.name;this.address=newAddress(other.address);// 复制 address}}
http://www.jsqmd.com/news/569511/

相关文章:

  • 基于Gradio的实时口罩检测系统搭建:从镜像部署到界面操作的完整教程
  • SUNFLOWER MATCH LAB跨平台开发:Java与Python混合编程实战
  • Phi-4-mini-reasoning效果展示:逻辑题‘如果A则B,非B,所以?’的准确归因
  • springboot+vue基于web的高校学生成绩管理系统设计系统
  • 2026年,探秘云南钢筋网片专业工厂
  • 【AI模型】社区-ModelScope
  • 2026防脱精华液哪家靠谱?成分与效果实测对比指南 - 品牌排行榜
  • NVIDIA Profile Inspector 终极指南:免费解锁显卡隐藏性能的完整教程
  • 万物识别镜像高级功能探索:除了基础识别,还能做什么?
  • 【机械视觉】Halcon实战:Hough变换在工业检测中的高效应用与参数调优
  • Nanbeige 4.1-3B像素前端快速上手:3步搭建复古JRPG风格AI聊天室
  • Wan2.2-I2V-A14B企业级部署案例:单卡24GB显存实现高并发视频API服务
  • FaceAware在社交应用中的实际应用:提升用户头像体验的7个场景
  • Anything to RealCharacters效果评测:与Stable Diffusion ControlNet写实方案对比
  • 2026年推荐一款好用的护发精油,秀发柔顺有光泽 - 品牌排行榜
  • cv_unet_image-colorization实操手册:侧边栏上传+主区对比+下载三步闭环
  • 龙伯格 luenberger观测器,永磁同步电机无位置传感器控制,simulink模型,使用P...
  • 新手如何借助快马平台AI生成代码,轻松入门蓝桥杯经典题型
  • Omni-Vision Sanctuary在嵌入式边缘设备上的轻量化部署思考
  • Wan2.2-I2V-A14B风格化探索:模拟经典电影镜头与美术风格
  • 忍者像素绘卷惊艳效果:九尾查克拉外衣粒子+像素抖动动态表现
  • 3大革新功能!猫抓浏览器扩展全方位解锁网页视频下载秘诀
  • 【企业通信】基于IPAD协议的企业微信群聊管理API:群操作功能接口设计与实现
  • 2026护发精油哪个牌子好?5款热门产品实测对比 - 品牌排行榜
  • 使用MATLAB进行DeOldify结果的后处理与定量分析
  • 告别多人协作文档合并痛点!企业级文档拆分合并系统解决方案
  • 2026年,南平本地钢筋网片工厂揭秘
  • MIPI 底协议层
  • Pixel Script Temple 效果进阶:YOLOv11目标识别引导的精准构图像素画
  • nli-distilroberta-base精彩案例:跨语言句子对(中英)蕴含关系识别效果