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

Java的浅克隆与深克隆

“克隆”一词总会让我们想起与生物学相关的科技医学技术,说的就是将动物的细胞取到后进行人工培育,从而培育出一个一模一样的动物(当然也包括人)。...在编程界中同样存在克隆的技术,只不过它与传统的医学不相同的是:它具有浅克隆和深克隆的区别。...在Java中是不能通过简单的赋值来解决对象复制的问题,开发中需要应用clone()方法来复制对象。...在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象...对基本数据类型,这样的操作是没有问题的,但对非基本类型变量,我们知道它们保存的仅仅是对象的引用,这也导致clone后的非基本类型变量和原始对象中相应的变量指向的是同一个对象。

1.3K40

理论 | JavaScript的深克隆和浅克隆

比如我想看一下JQuery的extend源码,就不得不再好好看看深克隆浅克隆的问题。 ---- 什么是深克隆? 我们都知道,JavaScript有六种基本的数据类型。...,object】 (在内存中表现为一个指针,保存在堆中) 将一个对象的所有属性均复制,并将该对象与原对象放在内存中不同的位置,此时,改变新对象的属性不会对原对象造成影响,这种行为叫做深克隆。...看他们的爱好: 浅克隆只是简单的复制对象,若对象其中一个属性是引用值,由于引用型变量保存的是内存的一个地址,所以后来的hobby属性,都指向内存中的同一块地址,最后输出的结果同样相同。...从上面的例子也可以看出,name等原始值的改变,并不会影响原对象中的原始值。 ---- 解决克隆引用值问题,还是需要深度克隆的!...for-in循环遍历对象上的所有属性,判断是否为引用值,若是,进行递归,直到所有属性都为原始值为止。 拷贝出来后,就是一个全新对像,就和之前没什么关系了,以前的改变也不能对新的产生影响!!

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

    Java的克隆

    说到克隆,本质都是使用一个已经实例化完成的对象的副本。 对于基本类型比较简单。...但实际情况是,当我们对 student1的 name进行更改时,student2的值就会被一起改变。 上面这个其实只是引用复制,大家都指向堆里的同一个引用,自然当数据发生变化时也会一起改变。...那么如何正确复制对象呢,这里就得说一下Java的Clone。 克隆 Java的克隆允许复制一个一模一样内容的对象出来,当改变A内容时,被克隆的B的内容不会一起改变。 为什么要克隆呢?...其实很简单,当我们复制了一个对象的引用,新对象的数据在发生变更时会同时修改原对象的数据。而这并不是我们想要的,我们只想修改新对象的数据。克隆可以解决这种场景。 这里面有两种克隆,浅克隆和深克隆。...最后一种克隆方法 如果我们想克隆的对象有多个层次的类型引用,这时候把每一个类型都实现 Clonable接口是不现实的。 那么可以用序列化和发序列化的方法来实现克隆。

    55320

    Java中的深克隆和浅克隆

    为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗?...克隆的对象可能包含一些已经修改过的属性, 而new出来的对象的属性都还是初始化时候的值, 所以当需要一个新的对象来保存当前对象的"状态"时就要靠克隆了....对于基本数据类型, 这样操作当然没问题, 但对于引用类型, 由于保存的仅仅是对象的引用, 克隆过去的引用所指向的是同一个对象....Java中实现浅克隆 java中实现clone要实现 Cloneable 接口, 该接口十分简单, 源码如下: ? 仅仅起到一个标识的作用. 下面是一个实现浅克隆的例子: ?...可以将序列化克隆封装为一个方法, 如下所示: ? 通过该工具类即可进行深度克隆.

    1.7K10

    谈谈你对深克隆和浅克隆的理解?

    一个工作了5年的程序员私信我说,前几天去阿里面试被问到这样一个这样的面试题,说谈谈你对深克隆和浅克隆的理解。...他回答说深克隆是克隆值,浅克隆是克隆引用,当时他只说了这样一句话,回答完以后,他看到面试官的表情很诧异,面试也没有继续深入追问了。小伙伴们,如果是你来回答,你也会这样回回答吗?...其实复制、克隆、拷贝表达的都是同一个意思。因为Java中的数据类型分为引用类型和值类型,因此,在克隆数据的过程中,就有了深克隆和浅克隆。 2、深克隆和浅克隆 那么,深克隆和浅克隆的本质区别又是什么呢?...第2点:改变一个值是否会影响到另一个值变化。 那么,到底什么是深克隆,什么是浅克隆呢? 先来看浅克隆,浅克隆就是数据拷贝后,一方数据变化另一方会跟着变化。...如图所示:obj1和obj2分别指向不同的原型对象,拷贝的是值不是内存地址。

    61720

    Java的对象克隆

    深拷贝指的是:在对象中存在其他对象的引用的情况下,会同时克隆对象中引用的其他对象,原对象和克隆的对象互不影响。介绍克隆要了解克隆的具体含义,先来回忆为一个包含对象引用的变量建立副本时会发生什么。...如果对象中的所有数据域都是数值或其他基本类型,拷贝这些域没有任何问题、但是如果对象包含子对象的引用,拷贝域就会得到相同子对象的另一个引用,这样一来,原对象和克隆的对象仍然会共享一些信息。...不过,通常子对象都是可变的,必须重新定义 clone() 方法来建立一个深拷贝,同时克隆所有子对象。在这个例子中,hireDay 域是一个 Date,这是可变的,所以它也需要克隆。...这样就允许子类在不支持克隆时选择抛出一个 CloneNotSupportedException()。子类的克隆必须当心子类的克隆。...Employee 克隆方法能完成工作吗?这取决于 Manager 类的域。在这里是没有问题的,因为 bonus 域是基本类型。但是 Manager 可能会有需要深拷贝或不可克隆的域。

    64410

    VirtualBox克隆后无法找到网卡的问题

    Virtualbox现在更新到了4.1.6版本,我记得在之前的版本中,镜像的克隆只能通过命令行的方式来进行,现在已经可以通过界面来进行克隆了,可以说非常的方便。...克隆的时候,我选择了Reinitialize the MAC address of all the network cards。...使用参考资料中的 mv /etc/udev/rules.d/70-persistent-net.rules ~ 重启也没有用。...然后定睛看了一下这个文件的内容,发现 NAME 的地方配置的有问题,而且克隆后的机器,网卡配置中的MAC地址没有对应的更新,需要手工修改下。 ? 一切完成后,重新启动服务器,网卡正常工作,OK!...参考资料: 1、Virtualbox克隆 2、VMWare克隆或复制虚拟机后找不到网卡的解决方法 3、udev - Linux Man Page

    1.3K20

    Java对象的深克隆与浅克隆(对象复制)

    想对一个对象进行复制,需重写clone()。 3 为啥克隆? 直接new一个新的不行?...克隆对象可能包含一些已修改过的属性,而new出对象的属性都还是初始值,所以当需要一个新对象保存当前对象的“状态”就靠clone。...浅克隆 如果原型对象的成员变量是值类型,将复制一份给克隆对象 如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象, 即原型对象和克隆对象的成员变量指向相同的内存地址。...深克隆 深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。 除了对象本身被复制外,对象所包含的所有成员变量也将复制。...5 解决多层克隆问题 如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型,使用clone方法就会很麻烦。这时我们可以用序列化的方式来实现对象的深克隆。

    3.1K52

    一文读懂深克隆与浅克隆的关系

    本文节选自《设计模式就该这样学》 1 分析JDK浅克隆API带来的问题 在Java提供的API中,不需要手动创建抽象原型接口,因为Java已经内置了Cloneable抽象原型接口,自定义的类型只需实现该接口并重写...因为我们希望复制出来的对象应该和原型对象是两个独立的对象,不再有联系。从测试结果来看,应该是hobbies共用了一个内存地址,意味着复制的不是值,而是引用的地址。...这样的话,如果我们修改任意一个对象中的属性值,protoType 和cloneType的hobbies值都会改变。这就是我们常说的浅克隆。只是完整复制了值类型数据,没有赋值引用对象。...换言之,所有的引用对象仍然指向原来的对象,显然不是我们想要的结果。那如何解决这个问题呢?Java自带的clone()方法进行的就是浅克隆。...因此,在Java中,如果想完成原型对象的深克隆,则通常使用序列化(Serializable)的方式。 2 使用序列化实现深克隆 在上节的基础上继续改造,增加一个deepClone()方法。

    33240

    一文读懂深克隆与浅克隆的关系

    本文节选自《设计模式就该这样学》 1 分析JDK浅克隆API带来的问题 在Java提供的API中,不需要手动创建抽象原型接口,因为Java已经内置了Cloneable抽象原型接口,自定义的类型只需实现该接口并重写...因为我们希望复制出来的对象应该和原型对象是两个独立的对象,不再有联系。从测试结果来看,应该是hobbies共用了一个内存地址,意味着复制的不是值,而是引用的地址。...这样的话,如果我们修改任意一个对象中的属性值,protoType 和cloneType的hobbies值都会改变。这就是我们常说的浅克隆。只是完整复制了值类型数据,没有赋值引用对象。...换言之,所有的引用对象仍然指向原来的对象,显然不是我们想要的结果。那如何解决这个问题呢? Java自带的clone()方法进行的就是浅克隆。...因此,在Java中,如果想完成原型对象的深克隆,则通常使用序列化(Serializable)的方式。 2 使用序列化实现深克隆 在上节的基础上继续改造,增加一个deepClone()方法。

    61400

    Java学习【接口的使用实例,浅克隆与深克隆】

    ,也必须实现Comparable的接口 但是无论是比较age还是name,用以上方法都比较固定,不够灵活,为了解决这个问题,我们来介绍下一个接口 Comparator接口 public class...Person类之后,实现对象的克隆 虽然Person类里面没有clone方法,但是Object类里面有,每一个类都默认继承与Object类,但此时还是报错了,这就需要在Person类中重写clone...原因是,自定义类型想要进行克隆还要实现Cloneable接口 点进源码发现Cloneable接口没有写任何方法,是一个空接口,空接口也叫做标记接口,表示当前类是可以被克隆的 之后还要处理一下异常...,再对返回值类型进行强转,因为此时返回的是Object类型的,这样就可以正常执行了 public static void main(String[] args) throws CloneNotSupportedException...,创建person2,把克隆出的数据赋值给person2 浅拷贝 在原来的基础上再加上一个Money类,此时再对克隆后的值进行修改 可以看出,当把person1的money修改之后,两个是都会发生改变的

    9610

    一文了解Java对象的克隆,深浅拷贝(克隆)

    一、什么是对象的克隆? 在Java的Object类中,有一个方法名为clone(),直译过来就是克隆,核心概念就是复制对象并返回一个新的对象。...三、测试(浅克隆) 按照前面官方文档提到的,clone通常是一个浅拷贝,如果要做到深拷贝,需要对复制对象中的对象引用进行修改,换句话说就是浅拷贝的效果就是引用例行的属性无法完全复制,被克隆对象和克隆对象中的该引用类型的属性指向同一个引用...System.out.println("克隆出来的新老王================="); System.out.println(newUser); // 改变老王cp信息的值及个人信息...(我就碰到过因为对象被同事插进来的代码导致对象发生了变更,代码出现BUG的问题,后面是使用的深拷贝才消除同事的代码对该对象的影响)那么如何实现对象的深拷贝呢?...如果这一点不注意,在重写clone方法嵌套调用时未能正确调用clone,依然会出现浅拷贝的问题。

    3.3K40

    Java--对象的克隆

    但如果我们需要在一个方法的调用期间修改一个参数,且不打算修改外部实体,就应该在自己方法的内部制作一个那个参数的副本来保护那个参数。 制作对象副本需要使用clone()方法。...这个例子中由于别名问题,原Vector和拷贝的Vector都包含了相同的对象,即两个Vector是完全独立的,但其中容纳的东西相同,这就是”浅拷贝“。”...它的存在有两个原因: 可能有一个上溯造型句柄指向一个基础类型,而且不知道它是否真的能克隆那个对象。在这种情况下,可用instanceof 关键字调查句柄是否确实同一个能克隆的对象连接。...这样,从它衍生出来的类的clone()方法调用super.clone()时会抛出异常。 将类设为final,从而防止克隆。若clone()尚未被我们的任何一个上级类覆盖,这一设想便不会成功。...若已被覆盖,那么再一次覆盖它,并“掷”出一个 CloneNotSupportedException(克隆不支持)违例。为担保克隆被禁止,将类设为final是唯一的办法。

    74270

    如何用单细胞研究癌症起源的单克隆与多克隆问题,提供详细原始代码

    The origin of inflammation-driven lesions Para_01 肿瘤的起源,无论是源自单一前体(单克隆起源)还是多个不同前体(多克隆起源,也称为多祖先起源),是癌症研究中的一个基本问题...炎症正常结肠的一个代表性单细胞系统发育。展示克隆扩张的谱系用颜色突出显示。 单克隆与多克隆病变中的单细胞适应度评分。 d, f–h 中的 P 值通过双侧 Wilcoxon 秩和检验得出。...Para_02 每个病变的单克隆性或多克隆性可以通过确定是否存在具有接近 1 的 CCF 值的克隆性 SSNV 来推断(图 3b)。...这引发了一个关键问题——多克隆启动是否涉及正向的克隆间相互作用,如克隆合作,这促进了整体的肿瘤生长。...Breakclone 通过置换检验计算了一个 P 值和一个克隆相关性评分(补充表 6)。

    15610

    克隆一个自己的 AI 来上网课,

    y 超神经 场景描述:在全球都开启远程办公、远程上课之际,一位外国工程师受不了每天的视频会议,于是用 AI 技术「克隆」了一个自己,替他去开会。...克隆一个自己的 AI,替我开会 视频会议并不是适合所有人,Twitter 上有人吐槽现在是活在 Zoom 的世界。 ?...所以,他脑洞大开,建立了一个 AI 驱动的克隆项目 Zoombot,可以克隆一个自己的虚拟形象,参加视频会议。...这个虚拟形象,使用最新的 AI 语音识别和文本语音转换,代替他参加 Zoom 会议,不仅可以显示自己的形象,还能回答问题。...克隆一个自己替你上 看到这里,有位同学不禁想到:这招完全可以用在网课上啊!(此处手动机智.gif) 很多学生党深有体会,从寒假就开始陷入被网课支配的恐惧中。

    1K10

    解决Linux克隆后eth0不见的问题

    1.通过VMware WorkStation的clone功能,克隆了一份Linux虚拟机,主机名为:mini2,执行ifconfig -a查看所有网卡信息,发现eth0不见了。...原因:clone来的虚拟机,网卡eth0和之前重复了,只显示eth1 2.vi /etc/sysconfig/network-scripts/ifcfg-eth0修改eth0的网卡信息, 因为clone...来的mini1虚拟机的UUID , HWADDR和之前的mini机一样, 删掉UUID , HWADDR,修改成如上图的样子。...3.修改这个文件,将eth1的地址复制给eth0,然后删掉eth1的配置, 也可以 删除下面这个文件: rm -rf  /etc/udev/rules.d/70-persistent-net.rules...的回复: 字节=32 时间<1ms TTL=64 来自 192.168.92.83 的回复: 字节=32 时间<1ms TTL=64 192.168.92.83 的 Ping 统计信息: 数据包

    2.7K40

    VirtualBox中克隆了一个虚拟系统出现IP问题

    由于要做日志服务器,所以至少需要两台虚拟系统做测试,为了避免在装一个虚拟机浪费时间,我就使用VirtualBox软件自带的功能导出了一个虚拟介质(相当于复制了一个虚拟系统),最后我启动这两台虚拟系统,只能有一台电脑能够分配...IP地址,我ifconfig了一下,发现他们怎么被分配相同了IP地址,于是在网上寻求解决方法,按照大牛们的提示,我做了如下操作: 1、通过VirtualBox重新生成了一下克隆的那台虚拟系统的Mac地址...,记得要先关闭系统,如图: 2、编辑网卡的配置文件,vim /etc/sysconfig/network-scripts/ifcfg-eth0,修改mac地址为新的mac地址: HWADDR="08:...*", ATTR{address}=="08:00:27:27:5e:bf", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1" 其中上面的一项是之前的网卡的mac...地址,也就是被克隆的网卡的地址,我将它删除掉,下面的一项是我们新添加的网卡的地址,但是NAME是eth1,这里我们需要改成eth0: # PCI device 0x8086:0x100e (e1000)

    68110
    领券