news 2026/6/15 21:06:20

深拷贝和浅拷贝区别

作者头像

张小明

前端开发工程师

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/6/15 13:35:06

【毕业设计】基于深度学习python-CNN卷积网络的动物是否疲劳识别基于python-CNN卷积网络的动物是否疲劳识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/15 20:05:21

输入产品的定价与销量,分析价格弹性,生成创新的价格促销策略。

这是一个极具商业价值的项目构想。下面我将为你提供一个完整的、基于Python的“价格弹性分析与创新促销策略生成器”程序&#xff0c;并包含你要求的所有部分。1. 项目概述项目名称&#xff1a; PriceGenius - 价格弹性分析与创新促销策略生成器项目目标&#xff1a; 本程序旨在…

作者头像 李华
网站建设 2026/6/15 18:56:45

基于大数据Hadoop+机器学习预测算法+Echarts的用户信用评估系统的设计与实现(精品源码+精品论文+上万数据集+答辩PPT)

博主介绍&#xff1a;CSDN毕设辅导第一人、靠谱第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交…

作者头像 李华
网站建设 2026/6/15 15:47:27

AI人脸隐私卫士如何应对艺术照?特殊光影处理策略分享

AI人脸隐私卫士如何应对艺术照&#xff1f;特殊光影处理策略分享 1. 背景与挑战&#xff1a;艺术照中的人脸保护难题 在数字影像日益普及的今天&#xff0c;用户对照片隐私的关注持续上升。尤其在社交媒体、云相册、家庭共享等场景下&#xff0c;人脸信息泄露风险成为不可忽视…

作者头像 李华
网站建设 2026/6/15 14:07:15

软考高项(信息系统项目管理师)—第7章 项目立项管理全解析

项目立项管理是信息系统项目从概念提出到正式启动的关键阶段&#xff0c;核心是通过科学论证确定项目是否具备实施价值与可行性&#xff0c;同时完成相关审批流程。本章内容在软考高项中&#xff0c;既会以选择题形式考查流程与要点&#xff0c;也会在论文中结合可行性研究、立…

作者头像 李华
网站建设 2026/6/15 15:52:46

Linux发行版从amd64向arm64移植的流程图解说明

从 x86 到 ARM&#xff1a;一次真实的 Linux 发行版跨架构移植实践 最近接手了一个项目——要把我们内部维护的一个基于 Debian 的定制 Linux 系统&#xff0c;从传统的 amd64 &#xff08;x86-64&#xff09;平台完整迁移到 arm64 &#xff08;AArch64&#xff09;架构上&…

作者头像 李华