浅拷贝(shallow copy)和深拷贝(deep copy)

article/2025/3/1 7:10:27

浅拷贝(shallow copy):只负责克隆按值传递的数据(比如基本数据类型、String类型)

深拷贝(deep copy):除了shallow copy的值外,还负责克隆引用类型的数据,基本是就是被克隆实例所有的属性数据都会被克隆出来。

这里推荐一篇介绍非常详细的外文文章

Difference Between Shallow Copy Vs Deep Copy In Java

什么是克隆?

克隆就是在内存中拷贝一份已有对象的过程。Java中java.lang.Object类中的方法clone()就是作为克隆用的。这个方法会把实例对象逐个字段的值原样拷贝过来,对于引用类型则是把对应的内存地址拷贝过来。不过不是所有类都能使用克隆方法,需要实现Cloneable接口。Cloneable接口是一个标识接口,仅做标记之用,接口中未声明任何方法。 

浅拷贝和深拷贝就是克隆相关的两种方法。默认clone()方法实现的是浅拷贝。如果要实现深拷贝,需要覆盖clone()方法。下面开始详细介绍浅拷贝和深拷贝

Java中的浅拷贝:

Java中默认的clone()方法就是浅拷贝,即拷贝原有对象的值。如果原有对象有任何引用对象,则引用对象的属性值会拷贝过去,但不会创建新的对象(译者注:也就是说只是把内存地址拷贝过去,并未创建新的实例)。这就意味着任何对这些被克隆对象的修改都会导致克隆对象发生相同的变动,反之亦然。浅拷贝不是百分百与原有对象保持独立的关系,会互相影响。

class Course
{String subject1;String subject2;String subject3;public Course(String sub1, String sub2, String sub3){this.subject1 = sub1;this.subject2 = sub2;this.subject3 = sub3;}
}class Student implements Cloneable
{int id;String name;Course course;public Student(int id, String name, Course course){this.id = id;this.name = name;this.course = course;}//Default version of clone() method. It creates shallow copy of an object.protected Object clone() throws CloneNotSupportedException{return super.clone();}
}public class ShallowCopyInJava
{public static void main(String[] args){Course science = new Course("Physics", "Chemistry", "Biology");Student student1 = new Student(111, "John", science);Student student2 = null;try{//Creating a clone of student1 and assigning it to student2student2 = (Student) student1.clone();}catch (CloneNotSupportedException e){e.printStackTrace();}//Printing the subject3 of 'student1'System.out.println(student1.course.subject3);         //Output : Biology//Changing the subject3 of 'student2'student2.course.subject3 = "Maths";//This change will be reflected in original student 'student1'System.out.println(student1.course.subject3);       //Output : Maths}
}

在上面的例子中,student1是Student类的一个对象实例,有三个字段,分别是id,name,course。course是个指向Course的引用对象,student2是通过克隆student1创建出来。通过浅拷贝,course字段的默认值在student1和student2是一样的,都指向Course对象。因此,任何对对象student2的改动都会反映到student1中,反之亦然。

shallow copy vs deep copy in java

Java中的深拷贝:

深拷贝很像浅拷贝,也会拷贝实例对象的值,但是不同的是,会额外再创建引用对象的实例。这也就意味着克隆对象与原型对象是互相分离的,独立互不影响的。任何对克隆对象的更改不会对原型对象产生任何影响。

如果要创建深拷贝,需要覆盖clone()方法,如下代码所示:

class Course implements Cloneable
{String subject1;String subject2;String subject3;public Course(String sub1, String sub2, String sub3){this.subject1 = sub1;this.subject2 = sub2;this.subject3 = sub3;}protected Object clone() throws CloneNotSupportedException{return super.clone();}
}class Student implements Cloneable
{int id;String name;Course course;public Student(int id, String name, Course course){this.id = id;this.name = name;this.course = course;}//Overriding clone() method to create a deep copy of an object.protected Object clone() throws CloneNotSupportedException{Student student = (Student) super.clone();student.course = (Course) course.clone();return student;}
}public class DeepCopyInJava
{public static void main(String[] args){Course science = new Course("Physics", "Chemistry", "Biology");Student student1 = new Student(111, "John", science);Student student2 = null;try{//Creating a clone of student1 and assigning it to student2student2 = (Student) student1.clone();}catch (CloneNotSupportedException e){e.printStackTrace();}//Printing the subject3 of 'student1'System.out.println(student1.course.subject3);         //Output : Biology//Changing the subject3 of 'student2'student2.course.subject3 = "Maths";//This change will not be reflected in original student 'student1'System.out.println(student1.course.subject3);       //Output : Biology}
}

下图展示了student1如何被创建

shallow copy vs deep copy in java

Java中浅拷贝和深拷贝可用如下表格作对比:

浅拷贝

深拷贝

拷贝对象与原型对象不是绝对分离的

拷贝对象与原型对象绝对分离

对拷贝对象的更改会影响到原型对象

对拷贝对象的更改不会影响到原型对象

默认的clone()方法只是浅拷贝

要创建深拷贝需要覆盖clone()方法

浅拷贝只推荐实例对象是基本数据类型的情况

如果是除基本类型以外的对象,推荐深拷贝

浅拷贝速度快,开销低

深拷贝速度慢,开销高

 

这里推荐两篇文章,也是对浅拷贝和深拷贝讲述的比较好,可以看看,会有帮助

漫谈deepcopy(深拷贝)和shallowcopy(浅拷贝)

What is the difference between a deep copy and a shallow copy


http://chatgpt.dhexx.cn/article/jEd13T8O.shtml

相关文章

js深拷贝deepCopy教程:支持循环引用、类型不丢失、可扩展、可定制

目录 1. 背景2. 简介3. 安装方式 3.1. 方式1&#xff1a;通过 npm 安装3.2. 方式2&#xff1a;直接下载原代码3.3. 方式3&#xff1a;通过<script>标签引入 4. 教程 4.1. API简介4.2. 基本使用4.3. 拷贝函数4.4. 指定拷贝深度4.5. 循环引用4.6. 保持类型信息4.7. 拷贝不可…

深入理解Python深拷贝(deepcopy)、浅拷贝(copy)、等号拷贝----看了还不懂找我

编程中难免会遇到copy&#xff08;浅拷贝&#xff09;与deepcopy&#xff08;深拷贝&#xff09;问题&#xff0c;一不小心就会掉进坑中了&#xff0c;或许很多人只知道有深浅拷贝&#xff0c;但是你又知道copy和""拷贝有什么区别么&#xff1f;也许很少有人对二者的…

Python-copy()与deepcopy()区别

最近在实习&#xff0c;boss给布置了一个python的小任务&#xff0c;学习过程中发现copy&#xff08;&#xff09;和deepcopy&#xff08;&#xff09;这对好基友实在是有点过分&#xff0c;搞的博主就有点傻傻分不清啊&#xff0c;但是呢本着一探到底的精神&#xff0c;还是要…

三分钟入门大数据之什么是用户画像?

哈喽&#xff0c;大家好&#xff0c;我是汉斯老师。近几年来&#xff0c;互联网行业由于较高的薪资收入&#xff0c;受到许多人的追捧。很多年轻的学子&#xff0c;或是其他行业的有志青年&#xff0c;都想要投身到这个行业中来。然而一方面受到“互联网寒冬”的影响&#xff0…

什么是用户画像?金融行业大数据用户画像实践

金融消费者逐渐年轻化&#xff0c;80、90后成为客户主力&#xff0c;他们的消费意识和金融意识正在增强。金融服务正在从以产品为中心&#xff0c;转向以消费者为中心。所有金融行业面对的最大挑战是消费者的消费行为和消费需求的转变&#xff0c;金融企业迫切需要为产品寻找目…

银行用户画像简介

当我们讨论产品、需求、场景、用户体验时&#xff0c;往往需要将焦点聚集在某类人群上&#xff0c;用户画像便是一种抽象的方法&#xff0c;是目标用户的集合。本文作者对银行用户画像体系的建设进行了分析&#xff0c;希望能给你带来一些帮助。 用户画像的正式英文名称是User …

用户画像基础之用户画像是什么

目录 0. 相关文章链接 1. 用户画像是什么 2. 画像简介 3. 标签类型 注&#xff1a;此博文为根据 赵宏田 老师的 用户画像方法论与工程化解决方案 一书读后笔记而来&#xff0c;仅供学习使用 0. 相关文章链接 用户画像文章汇总 1. 用户画像是什么 在互联网步入大数据时代…

详解用户画像

01画像简介 用户画像&#xff0c;即用户信息标签化&#xff0c;通过收集用户的社会属性、消费习惯、偏好特征等各个维度的数据&#xff0c;进而对用户或者产品特征属性进行刻画&#xff0c;并对这些特征进行分析、统计&#xff0c;挖掘潜在价值信息&#xff0c;从而抽象出用户的…

用户画像——什么是用户画像?和用户画像的计算框架选型

用户画像——什么是用户画像&#xff1f;和用户画像的计算框架选型 1.什么是用户画像&#xff1f; 1.1 应用场景 1.1.1 精细化运营 1.1.2 推荐系统 1.2 概念定义 1.2.1 总结场景对数据的需求 1.2.2 实现这些场的数据结构 1.2.3 用户画像的概念 2.用户画像…

什么是用户画像,流程、方法是什么?

什么是用户画像&#xff0c;流程、方法是什么? 01 用户画像概述1. 什么是用户画像2. 为什么需要用户画像 02 用户画像流程1. 整体流程1&#xff09;目标分析2&#xff09;标签体系构建3&#xff09;画像构建 2. 标签体系1&#xff09;事实标签2&#xff09;模型标签3&#xff…

一文让你彻底明白,到底什么是用户画像?

写在前面&#xff1a; 博主是一名大数据的初学者&#xff0c;昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白&#xff0c;写博客一方面是为了记录自己的学习历程&#xff0c;一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新。由于水平有限&a…

什么是用户画像——从零开始搭建实时用户画像(一)

用户画像 简介 用户画像&#xff0c;作为一种勾画目标用户、联系用户诉求与设计方向的有效工具&#xff0c;用户画像在各领域得到了广泛的应用。 用户画像最初是在电商领域得到应用的&#xff0c;在大数据时代背景下&#xff0c;用户信息充斥在网络中&#xff0c;将用户的每…

帮你更好地了解什么是用户画像

用户画像是一个挺新颖的词,最初它是大数据行业言必及之的时髦概念。现在我们运营谈及用户画像,它也是和精准营销、精细化运营直接钩挂的。 什么是用户画像? 在中文的语言环境中,用户画像是用来描述用户特征(用户背景、特征、性格标签、行为场景等)和联系用户需求与产品…

什么是用户画像,用户画像的作用是什么?

更多行业干货,上网易游戏学院app查看! https://game.academy.163.com/ssi/app/?referrer=niuke 什么是用户画像? 用户画像,由交互大师艾伦库伯在他的著作《交互设计精髓4》(《AboutFace 4》)中提出。他在书中介绍:“用户画像来源于研究中真实用户的行为和动机。用户画…

什么是用户画像?如何构建用户画像?

我们通过这篇文章&#xff0c;介绍我们理解的两种用户画像&#xff08;User Persona 和 User Profile&#xff09;&#xff0c;以及如何构建用户画像&#xff08;User Profile&#xff09;的标签体系并驱动产品智能。 User Persona 第一种用户画像&#xff08;User Persona&a…

用户画像(一)

本文转自&#xff1a;用户画像实践篇 终于有人把用户画像的流程、方法讲明白了 1 什么是用户画像 1. 1 概述 通过分析用户的基础信息、特征偏好、社会属性等各维度的数据&#xff0c;刻画出用户的信息全貌&#xff0c; 从中挖掘用户价值&#xff0c;从而提供个性化推荐、精准…

什么是真正的用户画像

如今在这个大数据时代&#xff0c;每个用户都被标签化&#xff0c;运用用户画像的方式了解用户&#xff0c;从而推送相关消息&#xff1b;最常见的情况就是你买了商品后&#xff0c;推荐会自动推送与此商品相关的商品&#xff0c;促进消费&#xff1b;本文作者分享了关于什么是…

用户画像:概述【从应用角度来看,可以分为行为画像、健康画像、企业信用画像、个人信用画像、静态产品画像、旋转设备画像、社会画像、经济画像...】

一、 什么是用户画像 用户画像是指根据用户的属性、用户偏好、生活习惯、用户行为等信息而抽象出来的标签化用户模型。通俗说就是给用户打标签&#xff0c;而标签是通过对用户信息分析而来的高度精炼的特征标识。通过打标签可以利用一些高度概括、容易理解的特征来描述用户&…

对话机器人---智能客服

https://blog.csdn.net/qq_40027052/article/details/78723576 详细的介绍了对话机器人涉及到的所有知识和技术。 整个对话机器人涉及到的知识点&#xff0c;本人属于自然语言处理的研究方向&#xff0c;所以还要很多需要学习的地方。 在实现一个对话机器人的过程中&#xff0c…

安排,Mysql入门到精通教程

来源&#xff1a; 来自网络&#xff0c;如侵权请告知博主删除????。 仅学习使用&#xff0c;请勿用于其他&#xff5e; spring&#xff0c;vue的&#xff0c;前后端的都给童鞋安排过一些了&#xff0c;有童鞋让我安排Mysql了&#xff0c;走起 目录: 课时1:Mysql介绍.mp4课…