news 2026/4/16 15:39:30

深拷贝和浅拷贝区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深拷贝和浅拷贝区别

深拷贝和浅拷贝区别

章节目录

文章目录

  • 深拷贝和浅拷贝区别
  • 1. 什么是浅拷贝?浅拷贝?
  • 2. 浅拷贝和深拷贝的区别是什么?
  • 3. **如何实现深拷贝和浅拷贝?**
  • 4. **深拷贝的实现方式有哪些?**

1. 什么是浅拷贝?浅拷贝?

浅拷贝是指复制对象时,只复制对象本身,而不复制对象引用的其他对象。浅拷贝后,新对象和原对象共享引用的其他对象。

深拷贝是指复制对象时,不仅复制对象本身,还递归地复制对象引用的其他对象。深拷贝后,新对象和原对象完全独立。

2. 浅拷贝和深拷贝的区别是什么?

  • 浅拷贝:只复制对象本身,引用的其他对象不复制,新对象和原对象共享引用的其他对象。

  • 深拷贝:递归地复制对象及其引用的所有对象,新对象和原对象完全独立。

拷贝的程度:

  • 浅拷贝只拷贝对象的引用,不创建新的对象实例。拷贝后的对象与原始对象共享同一份数据,对其中一个对象的修改会影响到另一个对象。

  • 深拷贝创建一个全新的对象实例,并将原始对象的所有属性值复制到新对象中。拷贝后的对象与原始对象是独立的,对任一对象的修改不会影响另一个对象。

对象引用:

  • 浅拷贝只复制对象引用,新旧对象仍然指向同一块内存空间,修改其中一个对象的属性会影响另一个对象。

  • 深拷贝会复制对象本身以及对象引用指向的其他对象,所有对象的引用都将指向全新的内存空间。

性能开销:

  • 浅拷贝的性能开销较小,因为仅复制对象的引用。

  • 深拷贝的性能开销较大,因为需要创建新的对象实例并复制所有属性。

3.如何实现深拷贝和浅拷贝?

  • 浅拷贝:使用Object.clone()方法,或者通过构造方法或手动复制字段

  • 深拷贝:手动实现深拷贝,或者使用序列化。

4.深拷贝的实现方式有哪些?

  • 手动实现:手动实现深拷贝是最直接的方法,通过逐个复制对象的字段来实现。这种方法需要对对象的内部结构有详细的了解,并且需要递归地复制所有引用的对象。

    publicclassDeepCopyExampleimplementsCloneable{privateintid;privateStringname;privateAddressaddress;publicDeepCopyExample(intid,Stringname,Addressaddress){this.id=id;this.name=name;this.address=address;}@OverrideprotectedObjectclone()throwsCloneNotSupportedException{// 手动实现深拷贝DeepCopyExamplecopy=(DeepCopyExample)super.clone();copy.address=(Address)this.address.clone();// 深拷贝地址returncopy;}publicstaticvoidmain(String[]args){Addressaddress=newAddress("123 Main St","City");DeepCopyExampleoriginal=newDeepCopyExample(1,"John",address);try{DeepCopyExamplecopy=(DeepCopyExample)original.clone();System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);// 修改地址copy.address.setStreet("456 New St");System.out.println("After modification:");System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);}catch(CloneNotSupportedExceptione){e.printStackTrace();}}}classAddressimplementsCloneable{privateStringstreet;privateStringcity;publicAddress(Stringstreet,Stringcity){this.street=street;this.city=city;}@OverridepublicObjectclone()throwsCloneNotSupportedException{returnsuper.clone();}publicStringgetStreet(){returnstreet;}publicvoidsetStreet(Stringstreet){this.street=street;}@OverridepublicStringtoString(){return"Address{"+"street='"+street+'\''+", city='"+city+'\''+'}';}}
  • 序列化:序列化是另一种实现深拷贝的方法。通过将对象序列化为字节流,然后再反序列化为新对象,可以实现深拷贝。这种方法适用于所有实现了Serializable接口的类。

    publicclassDeepCopyWithSerialization{publicstatic<TextendsSerializable>TdeepCopy(Tobj)throwsIOException,ClassNotFoundException{// 将对象序列化为字节流ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream();ObjectOutputStreamobjectOutputStream=newObjectOutputStream(byteArrayOutputStream);objectOutputStream.writeObject(obj);// 将字节流反序列化为新对象ByteArrayInputStreambyteArrayInputStream=newByteArrayInputStream(byteArrayOutputStream.toByteArray());ObjectInputStreamobjectInputStream=newObjectInputStream(byteArrayInputStream);return(T)objectInputStream.readObject();}publicstaticvoidmain(String[]args){Addressaddress=newAddress("123 Main St","City");DeepCopyExampleoriginal=newDeepCopyExample(1,"John",address);try{DeepCopyExamplecopy=DeepCopyWithSerialization.deepCopy(original);System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);// 修改地址copy.address.setStreet("456 New St");System.out.println("After modification:");System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);}catch(Exceptione){e.printStackTrace();}}}
  • 第三方库:一些第三方库(如 Apache Commons Lang)提供了深拷贝的功能,可以简化代码。

    publicclassDeepCopyWithApacheCommons{publicstatic<T>TdeepCopy(Tobj){returnSerializationUtils.clone(obj);}publicstaticvoidmain(String[]args){Addressaddress=newAddress("123 Main St","City");DeepCopyExampleoriginal=newDeepCopyExample(1,"John",address);DeepCopyExamplecopy=DeepCopyWithApacheCommons.deepCopy(original);System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);// 修改地址copy.address.setStreet("456 New St");System.out.println("After modification:");System.out.println("Original Address: "+original.address);System.out.println("Copy Address: "+copy.address);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:07:26

python实现罗斯勒吸引子(Rössler Attractor)

罗斯勒吸引子(Rssler Attractor)1. 理论基础与数学模型1.1 罗斯勒系统简介罗斯勒吸引子是德国科学家奥托罗斯勒(Otto Rssler)于1976年提出的一种混沌系统&#xff0c;是继洛伦兹吸引子之后第二个被发现的混沌吸引子。相比洛伦兹吸引子的双涡卷结构&#xff0c;罗斯勒吸引子具有…

作者头像 李华
网站建设 2026/4/16 13:35:34

测试语音助手可访问性:交互设计的核心挑战与系统性解决方案

——面向软件测试工程师的深度指南 一、语音交互可访问性测试的行业意义 随着全球数字无障碍立法加速&#xff08;如欧盟EAA法案、美国Section 508&#xff09;&#xff0c;语音助手可访问性已成为合规刚需。测试从业者需超越基础功能验证&#xff0c;深入交互设计层&#xff…

作者头像 李华
网站建设 2026/4/16 13:34:34

2026 年 PHP 8.4 依然重要:跳到 8.5 之前你该掌握的特性

2026 年 PHP 8.4 依然重要&#xff1a;跳到 8.5 之前你该掌握的特性 为什么 PHP 8.4 在 2026 年仍然相关 如果你的团队计划"今年上 PHP 8.5"&#xff0c;很可能会先聊到 PHP 8.4——不管你愿不愿意。 无聊但重要的原因是&#xff1a;支持窗口。 根据官方 PHP 支持…

作者头像 李华
网站建设 2026/4/16 13:34:33

GLM-4.6V-Flash-WEB部署教程:NVIDIA驱动配置指南

GLM-4.6V-Flash-WEB部署教程&#xff1a;NVIDIA驱动配置指南 智谱最新开源&#xff0c;视觉大模型。 1. 引言 1.1 学习目标 本文旨在为开发者提供一份从零开始部署 GLM-4.6V-Flash-WEB 视觉大模型的完整实践指南。通过本教程&#xff0c;您将掌握&#xff1a; 如何正确配置 …

作者头像 李华
网站建设 2026/4/16 15:07:15

数字信号处理篇---DFT中的混叠

DFT中的混叠&#xff1a;数字世界的“分身术”骗局&#x1f3ad; 核心比喻&#xff1a;旋转木马照相馆想象一个旋转木马游乐场&#xff0c;它&#xff1a;每10秒转一圈上面有8匹不同颜色的马&#xff08;红橙黄绿青蓝紫白&#xff09;你站在外面用相机拍照&#xff0c;但相机设…

作者头像 李华
网站建设 2026/4/16 13:34:53

手机也能跑的大模型:HY-MT1.5-1.8B效果实测分享

手机也能跑的大模型&#xff1a;HY-MT1.5-1.8B效果实测分享 随着全球多语言交流需求的爆发式增长&#xff0c;高质量、低延迟的翻译能力正从“增值服务”演变为智能终端的核心功能。然而&#xff0c;传统云端翻译方案存在网络依赖、隐私泄露和响应延迟等问题&#xff0c;难以满…

作者头像 李华