首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java中的clone() 深拷贝 浅拷贝

上图展示了浅拷贝:对于非基本数据类型,clone过后,结果两个指针指向了同一块儿内存空间,所以仅仅是浅拷贝,这样的话如果对一个对象进行操作,另一个内容也会变,这显然是不合理的,应该每个对象分别保存自己的数据...浅拷贝和深拷贝例子: [java] view plaincopy import java.util.Vector; public class Student implements Cloneable...called stu1'name:Tom stu2'name:Mary false Tom's course: [Java] Mary's course: [C#] 由结果可知,第一种调用浅拷贝导致对...Mary添加课程C#的时候,Tom的课程中竟然 也有了C#,而且Mary的课程中也有Tom的Java,且stu1.getCourses()==stu2.getCourses()返回的是 “true”,说明二者的...在上例中,深拷贝deepClone()和浅拷贝newInstance()函数都是 我们自己写的,所以deepClone()的Student cloning = (Student) super.clone

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    java浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

    最近用到了clone方法,并且遭遇到各种奇怪的bug; 一,浅拷贝 浅拷贝:对基本类型的数据是值拷贝,对String类型的拷贝也可以看作是值拷贝,这里不做讨论; 浅拷贝是什么呢,先上一段代码,对着看代码很容易理解...,会对原data的数据造成影响; 但是你在copyData中再增添一个元素或者删除元素,是不会对原data数组有影响的; why?...; 相对的在data中删除或增加元素也不会对copyData有影响; 综上:只有修改2个数组中共同引用的数据才会对clone的两个数据造成影响;而增加或删除都不会对彼此有影响; 二,深拷贝 什么是深拷贝...通过上面对浅拷贝的解释可以看出,拷贝对象在修改数据时会对原数据有影响;也就是说,其实clone的2个对象还有关联; 而深拷贝就是将2个对象彻底分离,当修改clone对象的数据时不会影响到原数据,而元数据修改也不会影响到...元素中存入的数据不是整型变量;是一个Student对象(有各种属性),要深拷贝的话还得把student对象也进行拷贝一次; 如果引用链很长的话,用这种方式进行深拷贝就会变得困难,Java还有另一种方式可以深拷贝实现

    88930

    看看你知道的“浅拷贝”是对的吗

    关于本篇文章的起源是一位大佬在面试的时候,询问应聘者关于浅拷贝的知识后,在应聘者的回答中,笔者发现有好一部分人对浅拷贝都是错误的,故有了此篇内容。 1. 还原现场 大佬:“如何复制一个对象?”...一探究竟 刚开始看到上面应聘者的例子的时候,其实我也认为应聘者写的是对的,因为在我的记忆里,对象的浅拷贝就是两个变量存储的值是相同的堆地址,而上面应聘者写的 a 和 b 符合这个条件,但是大佬提出异议后...2; console.log(a); // [ 1, 3, 5, { x: 2 } ]; console.log(b); // [ 1, 3, 5, { x: 2 } ]; 通过上面的代码既可以看出,浅拷贝的正确定义是第二种...深拷贝:遍历一个对象中所有的属性的值及对象属性中的属性值,不论是嵌套了几层,要完成所有对象属性的递归后,赋值给一个新的对象。...var b = JSON.parse(JSON.stringify(a)); 和原数据是否指向同一对象 第一层数据为基本数据类型 原数据中包含子对象 赋值 是 改变会使原数据一同改变 改变会使原数据一同改变

    35830

    看看你知道的“浅拷贝”是对的吗

    关于本篇文章的起源是一位大佬在面试的时候,询问应聘者关于浅拷贝的知识后,在应聘者的回答中,笔者发现有好一部分人对浅拷贝都是错误的,故有了此篇内容。 1. 还原现场 大佬:“如何复制一个对象?”...一探究竟 刚开始看到上面应聘者的例子的时候,其实我也认为应聘者写的是对的,因为在我的记忆里,对象的浅拷贝就是两个变量存储的值是相同的堆地址,而上面应聘者写的 a 和 b 符合这个条件,但是大佬提出异议后...2; console.log(a); // [ 1, 3, 5, { x: 2 } ]; console.log(b); // [ 1, 3, 5, { x: 2 } ]; 通过上面的代码既可以看出,浅拷贝的正确定义是第二种...,只拷贝已存在对象的对象属性的引用,其余非对象属性是占用新的内存空间,并非与原对象共享。...深拷贝:遍历一个对象中所有的属性的值及对象属性中的属性值,不论是嵌套了几层,要完成所有对象属性的递归后,赋值给一个新的对象。

    50320

    深入浅出| java中的clone方法

    回想一下,平时真正需要的是两个不同对象 Object类中的clone 先来看下clone的源码,在Object类中 /* Creates and returns a copy of this object...clone() throws CloneNotSupportedException; 仔细看,它是个native方法,native方法是由非java语言实现的(因为java本身无法直接对操作底层进行访问和操作...方法,但是它是protected,所以不能在类外访问 克隆一个对象,需要对clone重写 如何实现克隆 在说实现前,得区分下浅克隆和深克隆 浅克隆:原对象和克隆对象不同,但对象内的成员引用相同 深克隆:...e){ e.printStackTrace(); } return bag; } } 且在Student类的clone方法中执行Bag的...这种方法是利用序列化对象后可将其拷贝到流里,而原对象仍在jvm中,然后从流中将其反序列化成另一个对象到jvm中,从而实现深克隆 总结 克隆可分为浅克隆和深克隆,实际应用中一般使用深克隆 深克隆有两种实现方法

    97020

    【面试题精讲】深拷贝和浅拷贝区别了解吗?什么是引用拷贝?

    ---- 深拷贝和浅拷贝的区别: 深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在进行对象拷贝时常用的两种方式,它们之间的主要区别在于是否复制了对象内部的数据。...浅拷贝只是简单地将原对象的引用赋值给新对象,新旧对象共享同一块内存空间。当其中一个对象修改了这块内存中的数据时,另一个对象也会受到影响。...引用拷贝: 引用拷贝是指将一个对象的引用直接赋值给另一个变量,使得两个变量指向同一个对象。这样,在修改其中一个变量所指向的对象时,另一个变量也会随之改变。 引用拷贝通常发生在传递参数、返回值等场景中。...例如,在 Java 中,如果将一个对象作为参数传递给方法,实际上是将该对象的引用传递给了方法,而不是对象本身的拷贝。 需要注意的是,引用拷贝并非真正意义上的拷贝,而是共享同一份数据。...因此,对于引用拷贝的对象,在修改其内部数据时需要注意是否会影响到其他使用该对象的地方。 总结起来: 浅拷贝只复制了对象本身,不会复制对象内部的数据。

    2.1K30

    前端面试:浅拷贝和深拷贝的区别是什么_java中的浅拷贝和深拷贝

    我们在面试中经常会被问到浅拷贝和深拷贝的区别,正好群里也有在问到这个问题,于是今天就专门写一篇博客来讲解一下哈。 1.浅拷贝 浅拷贝是指,对基本类型的值拷贝,以及对象类型的地址拷贝。...怎么讲,什么是基本类型? 在js中,我们知道的基本类型有字符串,数字,布尔值。 当我们写这样的代码,就是浅拷贝。...这个道理,在对象中也一样适用。JavaScript中还有对象类型(也叫引用数据类型),对象类型的浅拷贝则只是拷贝了地址。...2.深拷贝 深拷贝是指,除了拷贝基本类型的值,还完全复刻了对象类型。 一个对象在内存中是固定存在的,我们如果要对其进行深拷贝,唯一的办法就是创建一个新的对象,里面的值完全复刻原来的对象。...3.深拷贝 Object.assign() Object.assign()是一种可以对非嵌套对象进行深拷贝的方法,如果对象中出现嵌套情况,那么其对被嵌套对象的行为就成了普通的浅拷贝。

    37930

    面试题-JAVA中的深拷贝、浅拷贝原理及实现

    我们在日常编码中,肯定会遇到对象拷贝的问题,比如接口的入参RequestDTO,我们在接收到入参DTO后,进行逻辑处理这时就需要把入参DTO拷贝给业务处理DTO,但是拷贝后,对两个DTO的修改是否会对彼此产生影响...,我们来带着这个疑问先了解下深浅拷贝的原理,在说说实战中是怎么拷贝的。...浅拷贝: 我们都知道JAVA数据类型分为基本数据类型和引用数据类型,对于浅拷贝来说,它会创建一个新的对象,如果对象中的属性是基本数据类型则拷贝值,如果是引用数据类型则拷贝内存地址,也就意味着任何一个对象改变都会对其他产生影响...浅拷贝的实现: 1.实现Cloneable接口,重写clone方法 @Override public Object clone() { try { return super.clone...深拷贝: 深拷贝与浅拷贝的不同之处在于,无论是基本数据类型对象还是引用数据类型对象都是独立的,相当于重新创建了一份对象,成为两个独立的个体。 深拷贝图: ?

    1.3K60

    深入浅出Java中的clone克隆方法,写得太棒了!

    Java中对象的创建 clone 顾名思义就是 复制 , 在Java语言中, clone方法被对象调用,所以会复制对象。...这两种拷贝方式分别叫做 浅拷贝 和 深拷贝 。 深拷贝和浅拷贝的原理如下图所示: ? 下面通过代码进行验证。推荐阅读:Java 中的 String 真的是不可变的吗?..."clone是浅拷贝的" : "clone是深拷贝的"; System.out.println(result); 打印结果: clone是浅拷贝的 所以,clone方法执行的是浅拷贝, 在编写程序时要注意这个细节...真的是深拷贝吗 通过上面的讲解我们已经知道: 如果想要深拷贝一个对象, 这个对象必须要实现Cloneable接口,实现clone方法,并且在clone方法内部,把该对象引用的其他对象也要clone一份...写在最后 clone在平时项目的开发中可能用的不是很频繁,但是区分深拷贝和浅拷贝会让我们对java内存结构和运行方式有更深的了解。至于彻底深拷贝,几乎是不可能实现的,原因已经在上一节中进行了说明。

    53340

    深入浅出Java中的clone克隆方法,写得太棒了!

    作者:张纪刚 blog.csdn.net/zhangjg_blog/article/details/18369201/ Java中对象的创建 clone 顾名思义就是 复制 , 在Java语言中, clone...深拷贝 or 浅拷贝 上面的示例代码中,Person中有两个成员变量,分别是name和age, name是String类型, age是int类型。..."clone是浅拷贝的" : "clone是深拷贝的"; System.out.println(result); 打印结果: clone是浅拷贝的 所以,clone方法执行的是浅拷贝, 在编写程序时要注意这个细节...真的是深拷贝吗 通过上面的讲解我们已经知道: 如果想要深拷贝一个对象, 这个对象必须要实现Cloneable接口,实现clone方法,并且在clone方法内部,把该对象引用的其他对象也要clone一份...写在最后 clone在平时项目的开发中可能用的不是很频繁,但是区分深拷贝和浅拷贝会让我们对java内存结构和运行方式有更深的了解。至于彻底深拷贝,几乎是不可能实现的,原因已经在上一节中进行了说明。

    30670

    Java枚举的values方法是拷贝操作,你知道吗?

    Java中的枚举类是我们平时写代码时经常会用到的一个类型,在我们创建枚举类之后,Java会默认在该类中为我们生成values、valueof 等方法。 但你知道吗,values方法可是个拷贝操作。...{ System.out.println(Type.values() == Type.values()); } } $ java Type.java false 如果values方法不是拷贝操作的话...上文我们说到,values方法是拷贝操作,但这只是我们的猜测,有什么证据能明确证明吗?...调用$VALUES的clone方法。 3. 将clone方法返回的对象强转成Type数组。 4. 返回该数组。 由此我们可以看到,values方法的确是拷贝操作。...上文我们说到,values等方法是javac动态生成的,是这样吗? 我们还是通过源码来确认下这个疑问。

    1.9K20

    Java中的数组是对象吗?

    转载此篇文章是感觉这篇文章的对其结论的分析过程很棒。 正文 Java中的数组是对象吗? Java和C++都是面向对象的语言。...2)name在对象中只表示一个引用, 也就是一个地址值,它指向一个真实存在的字符串对象。在这里严格区分了引用和对象。 那么在Java中,数组满足以上的条件吗?...中的数组是对象.这些方法是Object中的方法,所以可以肯定,数组的最顶层父类也是Object a.clone(); a.toString(); 在数组a上, 可以访问他的属性,也可以调用一些方法。...但是在JVM中,他的类型为[java.lang.String。顺便说一句普通的类在JVM里的类型为 包名+类名,也就是全限定名。同一个类型在java语言中和在虚拟机中的表示可能是不一样的。...中的数组是对象.这些方法是Object中的方法,所以可以肯定,数组的最顶层父类也是Object a.clone(); a.toString(); /*

    7.3K11

    java map是有序的吗_java中map遍历

    大家好,又见面了,我是你们的朋友全栈君。 背景 在调用接口A的时候,传给接口A的参数是通过调用接口B返回然后再重新封装的。...接口A是需要验签,也就是说传给接口A的所有参数一定要是按照接口B返回的固有顺序。 问题出现了!!! 接口B返回的字段是数组类型 ClassX[] , 传给接口A的字段是JSON字符串。...将数组ClassX[] 遍历,然后把key,value重新传入了一个Map,而这个Map 是 new HashMap产生的。最后调用接口A返回结果一直是验签失败! 原因分析 说来惭愧,基础太差!...map只是一个接口,他的实现类中 HashMap是无序的(只是说不是你插入时的顺序); LinkedHashMap是有序的(按你插入的顺序); TreeMap 是按key排序的; 将Map改为new

    1.6K20

    Java 中的 String 真的是不可变吗?

    我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。 ? 可以看出 String 类是 final 类型的,String 不能被继承。...String 真的 "不可变 " 吗? 来看下面这个例子。 ? 你有可能会问:str 不是由 Python 变成 Java 了吗?然后通过 substring 方法变成 ava 了吗?...这其实是初学者的一个误区,从上面看 String 的结构可以得知字符串是由字符数组构成的,str 只是一个引用而已,第一次引用了 "Python",后面变成了 "Java",而 substring 也是用...Java中的String真的是不可变吗? 所以说,这里的字符串并不是可变,只是变更了字符串引用。...关于 substring 在 JDK 各个版本的差异可以看这篇文章《注意:字符串substring方法在jkd6,7,8中的差异》,也可以去看 substring 的各个版本的源码。

    89620

    我要拷贝你—Java对象

    今天就和大家一起看看Java中的拷贝。 基础知识—数据类型 首先要了解一下Java中的数据类型,主要有两类: 基本类型。...基本数据类型在声明时,系统就给它分配数据空间,无论是否赋值。 引用类型。 包括 类,接口和数组 。引用类型在声明时只是给变量分配了引用空间,并不分配数据空间。 相等就是拷贝吗?...好了,了解了基础知识后,开始今天的拷贝问题。拷贝是什么呢?是用等号就可以完成的操作吗?...大家估计也发现了,我在每个拷贝后面都加了一个 「(浅拷贝)」,拷贝为啥还分深浅呢?...思考 今天也留一个思考题吧: Kotlin中数据类有个方法可以完成拷贝,你知道是什么吗?这个方法是深拷贝还是浅拷贝呢?

    47230

    在java中,什么情况下要使用深拷贝?为什么要使用深拷贝?怎么使用深拷贝?

    在Java中,深拷贝(Deep Copy)通常用于以下情况: 1....当对象包含引用类型成员时 如果一个对象包含对其他对象的引用,那么在进行浅拷贝时,这些引用也会被拷贝,导致原始对象和拷贝对象共享相同的引用类型成员。...在序列化过程中,通常会使用深拷贝来确保所有的对象都被正确地序列化,而不是只拷贝引用。 4....简化并发编程:在多线程环境中,使用深拷贝可以减少锁的使用,提高程序性能。 避免副作用:深拷贝可以防止对一个对象的操作无意中影响到另一个对象,从而避免副作用。...总之,深拷贝在Java中是非常有用的,尤其是在处理包含引用类型成员的对象时,它可以确保对象的独立性和不变性,从而提高程序的稳定性和性能。

    33310

    详解Java中的clone方法 -- 原型模式

    参考链接: Java 对象clone Java中对象的创建   clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。..."clone是浅拷贝的" : "clone是深拷贝的";         System.out.println(result);  打印结果为:   clone是浅拷贝的   所以,clone方法执行的是浅拷贝...真的是深拷贝吗   由上一节的内容可以得出如下结论:如果想要深拷贝一个对象, 这个对象必须要实现Cloneable接口,实现clone方法,并且在clone方法内部,把该对象引用的其他对象也要clone...那么,按照上面的结论, Body类组合了Head类, 而Head类组合了Face类,要想深拷贝Body类,必须在Body类的clone方法中将Head类也要拷贝一份,但是在拷贝Head类时,默认执行的是浅拷贝...假设Face对象内部组合了Mouth对象,并且Mouth对象内部组合了Tooth对象, 内存结构如下图: 写在最后   clone在平时项目的开发中可能用的不是很频繁,但是区分深拷贝和浅拷贝会让我们对java

    40600

    详解Java中的clone方法:原型模式

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。..."clone是浅拷贝的" : "clone是深拷贝的"; System.out.println(result); 打印结果为: clone是浅拷贝的 所以,clone方法执行的是浅拷贝, 在编写程序时要注意这个细节...真的是深拷贝吗 由上一节的内容可以得出如下结论:如果想要深拷贝一个对象, 这个对象必须要实现Cloneable接口,实现clone方法,并且在clone方法内部,把该对象引用的其他对象也要clone一份...的是浅拷贝,也就是说Head中组合的Face对象并不会被拷贝。...写在最后 clone在平时项目的开发中可能用的不是很频繁,但是区分深拷贝和浅拷贝会让我们对java内存结构和运行方式有更深的了解。至于彻底深拷贝,几 乎是不可能实现的,原因已经在上一节中进行了说明。

    74910
    领券