展开

关键词

克隆和浅克隆

浅拷贝 定义 浅拷贝其实是把一个对象的值复制一份到克隆的对象中。不需要去执行构造函数,所以效率会快很多,这是浅拷贝的一个优点。 但是对于可变类来说,克隆以后对象的值并没有和原对象分离开来,而是相互影响,所以这是浅拷贝的一个缺点。 ? originalObject.clone(); System.out.println(destObject); } } 深拷贝 定义 浅拷贝其实是把一个对象的值复制一份到克隆的对象中并为每个可变类属性创建内存空间 这样的话,克隆后的对象的值和原来的对象的值互不影响。因为他们指向的是堆内存中不同的内存空间。 ? 实现方案 重写 Object 的 clone 方法,并将每个可变类属性也克隆一次。 浅克隆拷贝的值(对象的话就是引用值),使用的同一块内存空间。深拷贝拷贝值的同时还创建了内存空间,使用的是不同的内存空间。不可变类对象的拷贝使用浅克隆就行。

70110

浅谈深克隆和浅克隆

克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。 如图所示,深克隆和浅克隆之后对象的指向地址差异。 pos:当前对象的地址; son:son属性所指向的地址; name:对象的name属性。 1055780-20190821154716863-900289879.jpg 浅克隆实现: 对象实现Cloneable并重写clone方法不进行任何操作时,调用clone()方法将实现浅克隆。 便捷方式使用HuTool,继承cn.hutool.clone.CloneSupport类或者实现cn.hutool.clone.Cloneable接口 深克隆实现: 将对象流将对象写入流然后再读出。

30200
  • 广告
    关闭

    腾讯云+社区系列公开课上线啦!

    Vite学习指南,基于腾讯云Webify部署项目。

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

    JavaScript 浅克隆与深克隆

    克隆与深克隆 前言 浅克隆:浅克隆只是拷贝基本类型数据。 深克隆:就是创建一个新的空对象,开辟一块内存,然后将原对象中的数据全部复制过去,完全切断两个对象间的联系。新对象跟原对象不共享内存,修改新对象不会改到原对象。 区别:浅克隆和深克隆最大的区别就是对引用值的处理了,即浅克隆之后你改我也改,深克隆之后你改我不改。 基本类型数据:保存在栈(stack)内存。 引用类型数据:保存在堆(heap)内存。 浅克隆概念 在浅克隆中,原始值的克隆没问题,只是值的拷贝,不会出现你改我改的问题。但是引用值的克隆,就会出现你改我也改的问题,因为浅层克隆的是地址,即指向的是同一空间。 深克隆概念 进行深克隆之后,对于引用值的克隆问题就能解决了,因为在深克隆之后,值各自独立,互不影响。

    26910

    Java | 浅克隆与深克隆

    但当对象属性较多时,这样的克隆方式会比较麻烦,所以Object类中实现了clone方法,用于克隆对象,Java中的克隆分为浅克隆与深克隆。 实现克隆的方式 1.对象的类需要实现Cloneable接口 2.重写Object类中的clone()方法 3.根据重写的clone()方法得到想要的克隆结果,例如浅克隆与深克隆。 深克隆:复制对象本身的同时,也复制对象包含的引用指向的对象,即修改被克隆对象的任何属性都不会影响到克隆出来的对象。 ? ? ,修改被克隆对象的基本属性,并不会影响克隆出来的对象。 这是因为 String 对象是不可修改的对象,每次修改其实都是新建一个新的对象,而不是在原有的对象上修改,所以当修改 String 属性时其实是新开辟一个空间存储 String 对象,并把引用指向该内存

    29810

    Java的浅克隆与深克隆

    克隆”一词总会让我们想起与生物学相关的科技医学技术,说的就是将动物的细胞取到后进行人工培育,从而培育出一个一模一样的动物(当然也包括人)。 在编程界中同样存在克隆的技术,只不过它与传统的医学不相同的是:它具有浅克隆和深克隆的区别。 类实例化成对象后,就意味着要在内存中占据一块空间存放实例。想要对这块空间操作就要应用到对象的引用。引用在Java语言中的体现就是变量,而变量的类型就是这个引用的对象。 UnCloneA的实例对象unCA的clone结果不一致,int类型是真正的被clone了,因为改变了b2中的aInt变量,对b1的aInt没有产生影响,也就是说,b2.aInt与b1.aInt已经占据了不同的内存空间 从中可以看出,调用Object类中clone()方法产生的效果是:先在内存中开辟一块和原始对象一样的空间,然后原样拷贝原始对象中的内容。

    16840

    克隆 JavaScript

    克隆克隆克隆无法copy数组和对象 var obj = { name : "abs", age : '18', sex : 'male' } var obj1 = {} ;//防止用户不输入target for(var k in Origin){ target[k] = Origin[k]; } } clone(obj,obj1); 深克隆

    7910

    克隆

    你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 你必须将 给定节点的拷贝 作为对克隆图的引用返回。

    17730

    Java中的深克隆和浅克隆

    为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗? 概念 浅克隆: 被克隆的对象里的所有变量值都与原来的对象相同, 而所有对其他对象的引用仍然指向原来的对象. 简单说, 浅克隆克隆当前对象, 而不克隆当前对象所引用的对象. 简单说, 深克隆不仅克隆了当前对象, 还把当前对象所引用的对象都复制了一遍. Object中的clone Object类中的clone()方法属于浅克隆. 它的工作原理如下: 在内存中先开辟一块和原始对象相同的空间, 然后复制原始对象的内容. Java序列化克隆 如果引用类型中海包括引用类型, 要实现多层克隆会很麻烦, 这使用可以使用序列化和反序列化的方式实现对象的深克隆.

    20910

    【java开发系列】—— 深克隆和浅克隆

    Java支持我们对一个对象进行克隆,通常用在装饰模式和原型模式中。那么什么是深克隆,什么是浅克隆呢。   【浅克隆】,通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的。    【深克隆】,克隆的时候会复制它的子对象的引用,里面所有的变量和子对象都是又额外拷贝了一份。   下面的两个例子可以很好的说明他们的区别:   首先看一下类图 ?    Husband类有一个对wife的引用,当进行浅克隆的时,wife变量都会指向同一个Wife;而进行深克隆时,会指向不同的Wife。 下面进行一下验证:   【浅克隆】 1 public Object clone() { 2 Husband husband = null; 3 try{ 4 e.printStackTrace(); 7 }finally{ 8 return husband; 9 } 10 }   【深克隆

    31270

    1-02 深克隆与浅克隆

    1-02 深克隆与浅克隆 what 定义 深拷贝与浅拷贝 jdk有个接口java.lang.Cloneable 这个接口是空接口,里面什么东西都没有 它的意思是实现了这个接口的类都是可以克隆的 真正实现了clone方法的是java.lang.Object父类 由此可见,每一个类都是有clone()方法的 但是这个clone()只是一个浅克隆方法 浅克隆定义: 复制出来的对象的所有变量都含有与原来的对象相同的值 换言之,深克隆把要克隆的对象所引用的对象都克隆了一遍 图解 浅克隆 ? 深克隆 ? ,但是从内存上看 已经是不同的内存地址了 System.out.println("浅克隆"+(clone == testObject)); System.out.println("浅克隆 ("浅克隆"+clone.hashCode()); // 浅克隆的对象 里面成员属性的 地址应该是一样的, 所以这里equals应该还是true System.out.println("浅克隆

    27510

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

    比如我想看一下JQuery的extend源码,就不得不再好好看看深克隆克隆的问题。 ---- 什么是深克隆? 我们都知道,JavaScript有六种基本的数据类型。 ---- 我们还是先看浅克隆吧。。。 看他们的爱好: 浅克隆只是简单的复制对象,若对象其中一个属性是引用值,由于引用型变量保存的是内存的一个地址,所以后来的hobby属性,都指向内存中的同一块地址,最后输出的结果同样相同。 ---- 解决克隆引用值问题,还是需要深度克隆的! for-in循环遍历对象上的所有属性,判断是否为引用值,若是,进行递归,直到所有属性都为原始值为止。 看他们的爱好: ---- 一些扩展 js里的concat函数 concat函数对数组进行了深度克隆 var a = [1,2,3]; console.log(a.concat(4,5)); //[1,

    6120

    JAVA中的浅克隆和深克隆分析

    1.定义 浅克隆(拷贝):复制一个对象的实例,但是这个对象中包含的其它的对象还是共用的。一般用super.clone()方法,clone的对象就是浅克隆。 深克隆(拷贝):复制一个对象的实例,而且这个对象中包含的其它的对象也要复制一份。 当然,实现深克隆的方法并不局限于流这一种办法,还可以通过json等其他办法实现。

    17220

    对象克隆 初探

    对象克隆 对象克隆指的是对象的赋值操作 clone() 方法 protected Object clone() throws CloneNotSupportedException 创建并返回此对象的一个复制副本 实现克隆操作 class Book implements Cloneable { // 实现 Cloneable接口,对象可以被克隆 private String title ; private throws CloneNotSupportedException { return super.clone(); }// 覆写 clone方法,调用父类的clone()方法,可以实现对象克隆 CloneNotSupportedException { Book book_A = new Book("Java",11.1) ; Book book_B = (Book) book_A.clone() ; // 克隆操作 完成 } } 对象克隆的理论价值高于实际价值 重点: 上述的代码中,提到了 标记接口 ,这个概念十分重要关键,标记接口好比一张口令卡一样,只有拿到(实现)标记接口(口令卡)才可以进入一些特定的地方

    9910

    浅析克隆

    创建对象的四大方法:1、new;2、反射;3、克隆;4、反序列化 今天来看一下如何克隆一个对象出来,克隆分为2种,一种是浅克隆,一种是深克隆。 一、在浅克隆中,如果原型对象的属性是值类型(如int,double,byte,boolean,char等),将复制一份给克隆对象;如果原型对象的属性是引用类型(如类,接口,数组,集合等复杂数据类型),则将引用对象的地址复制一份给克隆对象 ,也就是说原型对象和克隆对象的属性指向相同的内存地址。 深克隆就是让克隆对象的引用属性跟原型对象没有关系,由浅克隆的特性,我们可以知道,克隆出来的对象本身与原型对象是不同的内存地址的,由此我们可以将引用类型也添加克隆的特性,这样就可以将引用类型也分离出来。 false 附件 附件 由此可见,深克隆后,附件对象的内存地址已经不一样了,修改了克隆对象的附件地址,原型对象并不会受到影响。

    16820

    Java的克隆

    克隆 Java的克隆允许复制一个一模一样内容的对象出来,当改变A内容时,被克隆的B的内容不会一起改变。 为什么要克隆呢? 克隆可以解决这种场景。 这里面有两种克隆,浅克隆和深克隆。 浅克隆- shallow clone 不管是浅克隆还是深克隆,都要先实现 Clonable接口,然后复写 clone()方法并改为 public。 如果我们想把克隆对象里的非基本类型也一并克隆的话,那么需要把引用的类型也同样实现克隆接口。 最后一种克隆方法 如果我们想克隆的对象有多个层次的类型引用,这时候把每一个类型都实现 Clonable接口是不现实的。 那么可以用序列化和发序列化的方法来实现克隆

    23620

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

    如何实现克隆克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制,下面将对两者进行详细介绍。 浅克隆只是复制了addr变量的引用,并没有真正的开辟另一块空间,将值复制后再将引用返回给新对象。 为了达到真正的复制对象,而不是纯粹引用复制。 浅克隆 在浅克隆中 如果原型对象的成员变量是值类型,将复制一份给克隆对象 如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。 深克隆 ? 在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。 name; } @Override public String toString() { return "Inner的name值为:" + name; } } 这样也能使两个对象在内存空间内完全独立存在

    1.3K42

    克隆虚拟机

    不难,这次的话主要是需要搭建完全分布式,也就是需要多台机器组成一个机群,那么就克隆了两台机器,组建了一个有三台机器的集群。 主要操作不难,直接看下图跟着操作就行,一步一步来,废话不多说,直接开始吧。 注意:在开始克隆前一定要先关闭准备克隆的虚拟机。 ? ? ? ? ? ?

    33520

    HTTrack - 克隆任意网站

    HTTrack可以克隆指定网站-把整个网站下载到本地。 可以用在离线浏览上,也可以用来收集信息(甚至有网站使用隐藏的密码文件)。 一些仿真度极高的伪网站(为了骗取用户密码),也是使用类似工具做的。 zsh: brew install httrack HTTrack帮助: httrack --help 使用示例: httrack https://imszz.com/navi -O /tmp 上面命令克隆了网站路径下所有内容 ,不带路径克隆所有内容

    19210

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

    一、什么是对象的克隆? 在Java的Object类中,有一个方法名为clone(),直译过来就是克隆,核心概念就是复制对象并返回一个新的对象。 (1)在要实现克隆的对象类中实现Cloneable接口。 为啥? 三、测试(浅克隆) 按照前面官方文档提到的,clone通常是一个浅拷贝,如果要做到深拷贝,需要对复制对象中的对象引用进行修改,换句话说就是浅拷贝的效果就是引用例行的属性无法完全复制,被克隆对象和克隆对象中的该引用类型的属性指向同一个引用 浅拷贝的情况下,原被克隆对象发生变化后,克隆对象的基本数据类型和不可变引用数据类型(String)的数据未发生影响,而cp字段为可变的应用类型,可以观察到克隆对象的内容随着被克隆对象的变化发生了同样的变化 列出以下几种常见的方式: (1)clone函数的嵌套调用 既然引用类型无法被完全克隆,那么我们可以考虑在引用类型所在的类也实现Cloneable接口,在外层User类的clone方法调用属性的克隆方法。

    1.6K40

    Go克隆几种方式

    Go克隆几种方式 序列化的方式实现深度拷贝 最简单的方式是基于序列化和反序列化来实现对象的深度复制: func deepCopy(dst, src interface{}) error { var /深度克隆,可以克隆任意数据类型 func DeepClone(src interface{}) (interface{}, error) { typ := reflect.TypeOf(src) 再给个代码例子吧: package utils import ( "encoding/json" "reflect" ) //浅克隆,可以克隆任意数据类型,对指针类型子元素无法克隆 dst.Set(data) //设置数据 return dst.Interface() //返回 } } //深度克隆 ,可以克隆任意数据类型 func DeepClone(src interface{}) interface{} { typ := reflect.TypeOf(src) if typ.Kind

    28140

    相关产品

    • 网络空间云监测系统

      网络空间云监测系统

      网络空间云监测系统(CCMS)是腾讯云专门面向行业用户的网络风险发现与评估平台,结合漏洞扫描、内容检测、全网威胁情报发现能力等,为用户提供全面、及时的网络风险监测评估服务,并可提供配套安全管家服务,可对相关风险提供及时有效的响应处置。

    相关资讯

    热门标签

    扫码关注云+社区

    领取腾讯云代金券