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

Java对象克隆与浅克隆对象复制)

想对一个对象进行复制,需重写clone()。 3 为啥克隆? 直接new一个新的不行?...克隆对象可能包含一些已修改过的属性,而new出对象的属性都还是初始值,所以当需要一个对象保存当前对象的“状态”就靠clone。...克隆 克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象克隆将原型对象的所有引用对象也复制一份给克隆对象。 除了对象本身被复制外,对象所包含的所有成员变量也将复制。...这时我们可以用序列化的方式来实现对象克隆。) 序列化就是将对象写到流的过程,写到流中的对象是原有对象一个拷贝,而原对象仍然存在于内存中。...通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现克隆

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

    JS完美收官之浅克隆克隆

    1996年7月5日,在英国爱丁堡市罗斯林研究所出生了一只克隆羊多莉,克隆英文名"clone",clone起源于希腊文"klone",也称为无性繁殖,克隆是生物体通过体细胞进行无性繁殖,最终形成基因完全相同的后代...,多莉与多塞特母绵羊具有完全相同的外貌,而我们程序中的克隆跟这类似,就是把一个对象中的属性复制一份放到另一个对象中。...浅克隆 什么是浅克隆?浅克隆就是当我把obj{}对象里面的所有属性拷贝到obj1{}中后,然后我分别改变对象里面的变量,原始值互不影响,引用值一个改变,另一个跟着变。...,另一个跟着变,这就是浅克隆。...克隆(主要) 那什么是克隆呢?克隆就是修改引用值时,互不影响,你改我不变。

    1.3K20

    JS面试题】克隆 和 浅克隆 有了解过吗?能手写克隆吗?

    克隆 和 浅克隆 有了解过吗?能手写克隆吗? 什么是克隆克隆其实就是拷贝,就是把一个对象中的属性复制一份,放到另一个对象中的过程。而属性的数据是有原始值和引用值之分。...浅克隆:当我们复制对象中属性的时候,如果是原始值,则两个对象中的变量随意修改,两者互不影响(敌动我不动)。如果是引用值,一个对象的变量改变,则另一个对象跟着变(敌动我便动)。...克隆克隆就是解决拷贝引用值时“敌动我便动”的问题,无论数据怎么修改,两者互不影响。...克隆的实现有两种方式:递归拷贝和JSON函数拷贝,我会用这两种方式分别来实现拷贝 递归拷贝:将obj克隆到newObj中 let obj = { name: "前端猎手",...[] : {}; //建立相对应的数组或对象 deepClone(origin[prop], target[prop]); //递归,为了拿到引用值里面还有引用值

    1.5K10

    克隆和浅克隆

    概述 Java 集合中提供的拷贝构造函数只支持浅拷贝而不是拷贝,这是因为集合中的拷贝构造函数是通过引用的复制来达到浅拷贝的。这意味着存储在原有集合和克隆集合中的对象会保持一致(指向同一内存地址)。...因为它是一个不可变的类,所以可以在拷贝构造函数中让两个字符串对象指向同一个地址也并不会相互影响。 浅拷贝 定义 浅拷贝其实是把一个对象的值复制一份到克隆对象中。...不需要去执行构造函数,所以效率会快很多,这是浅拷贝的一个优点。但是对于可变类来说,克隆以后对象的值并没有和原对象分离开来,而是相互影响,所以这是浅拷贝的一个缺点。 ?...定义 浅拷贝其实是把一个对象的值复制一份到克隆对象中并为每个可变类属性创建内存空间。...浅克隆拷贝的值(对象的话就是引用值),使用的同一块内存空间。拷贝拷贝值的同时还创建了内存空间,使用的是不同的内存空间。不可变类对象的拷贝使用浅克隆就行。

    2.2K10

    Java | 浅克隆克隆

    前言 克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个对象,并对相应的属性进行数据,这样也能实现克隆的目的。...但当对象属性较多时,这样的克隆方式会比较麻烦,所以Object类中实现了clone方法,用于克隆对象,Java中的克隆分为浅克隆克隆。...浅克隆克隆的区别 浅克隆:复制对象时仅仅复制对象本身,包括基本属性,但该对象的属性引用其他对象时,该引用对象不会被复制,即拷贝出来的对象与被拷贝出来的对象中的属性引用的对象是同一个。...克隆:复制对象本身的同时,也复制对象包含的引用指向的对象,即修改被克隆对象的任何属性都不会影响到克隆出来的对象。 ? ?...,并不会克隆对象的属性引用的对象,当修改被克隆对象的成绩时,克隆出来的对象也会跟着改变,即两个对象的属性引用指向的是同一个对象

    1.7K20

    浅谈克隆和浅克隆

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

    2.1K00

    js 数组对象拷贝

    结论:对象的拷贝不能采用直接赋值的方式。 背景 踩过的坑如下: ? formData本来是父组件传过来的,但是我不想直接用,于是我直接赋值给一个formDataCopy的对象。...以上是背景,所以我就对浅拷贝和拷贝进行了总结: 浅拷贝 什么是浅拷贝:两者是指向一个对象对象的浅拷贝 1、对象的直接遍历赋值。...两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变,所以是浅拷贝。...新旧数组指向的是一个对象。...拷贝 (下面说的拷贝是基本对象拷贝,不考虑对象的复杂属性,比如set,get,Function等) 1、最简单的方式 JSON.parse(JSON.stringify(Obj)) 这种方法使用较为简单

    4.7K30

    Java的浅克隆克隆

    克隆”一词总会让我们想起与生物学相关的科技医学技术,说的就是将动物的细胞取到后进行人工培育,从而培育出一个一模一样的动物(当然也包括人)。...在编程界中同样存在克隆的技术,只不过它与传统的医学不相同的是:它具有浅克隆克隆的区别。...对Hashtable表存储的任何一个StringBuffer对象(更确切的说应该是对象的引用)的改动,实际上都是对同一个"StringBuffer"的改动。...在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象...要说明的有两点:一是拷贝对象返回的是一个对象,而不是一个引用。二是拷贝对象与用new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。

    1.3K40

    JS 数组、对象拷贝

    博客地址:https://ainyi.com/72 JavaScript 程序中,对于简单的数字、字符串可以通过 = 赋值拷贝 但是对于数组、对象对象数组的拷贝,就有浅拷贝和拷贝之分 浅拷贝就是当改变了拷贝后的数据...= [1, 2, 3] let b = a.slice(0) b.push(4) a // [1, 2, 3] b // [1, 2, 3, 4] concat() 数组方法 concat() 连接一个或多个数组...,并返回一个副本 那么不设置参数,就返回本数组 let a = [1, 2, 3] let b = a.concat() b.push(4) a // [1, 2, 3] b // [1, 2, 3,...,但是对于二维数组、对象数组、对象里包含对象,以上方法均达不到拷贝方法 以上只能达到数组、对象的第一层的==拷贝==,对于里面的数组或对象属性则是==浅拷贝==,因为里面的内存地址只是拷贝了一份,但都是指向...==同一个地址== 所以当改变数组、对象里的数组元素或对象,原数据依然会改变 二维数组、对象数组、多层对象拷贝 最常用的 JSON 序列化与反序列化 使用 JSON.parse(JSON.stringify

    8.2K30

    简单理解浅克隆克隆

    定义 浅克隆(Shadow Clone): 拷贝对象时仅仅拷贝对象本身,而不拷贝对象包含的引用指向的对象;对于数据类型是基本数据类型的成员变量,会直接进行值传递,也就是将该属性值复制一份给新的对象。...克隆(Deep Clone): 将原型对象中所有类型,无论是值类型还是引用类型,都复制一份给克隆对象。...这样就会存在两个对象的成员变量同时指向一个实例,这种情况下,在对一个对象中的该成员变量进行修改会影响到另一个对象的该成员变量值。...所以这里引入了克隆。即要克隆类的基本数据类型,以及所有非基本数据类型的属性。...克隆方式 1、实现Cloneable接口 2、使用JDK自带的字节流实现克隆 3、使用第三方工具类实现克隆,比如Apache Commons Lang 4、使用Json工具实现克隆,比如Gson

    11710

    理论 | JavaScript的克隆和浅克隆

    比如我想看一下JQuery的extend源码,就不得不再好好看看克隆克隆的问题。 ---- 什么是克隆? 我们都知道,JavaScript有六种基本的数据类型。...,object】 (在内存中表现为一个指针,保存在堆中) 将一个对象的所有属性均复制,并将该对象与原对象放在内存中不同的位置,此时,改变新对象的属性不会对原对象造成影响,这种行为叫做克隆。...看他们的爱好: 浅克隆只是简单的复制对象,若对象其中一个属性是引用值,由于引用型变量保存的是内存的一个地址,所以后来的hobby属性,都指向内存中的同一块地址,最后输出的结果同样相同。...看他们的爱好: ---- 一些扩展 js里的concat函数 concat函数对数组进行了深度克隆 var a = [1,2,3]; console.log(a.concat(4,5)); //[1,...的原有属性: 2.当继承的对象属性中有引用类型的时候,两个对象同时指向一个对象,改变一个一个也随之改变。

    88120

    Java中的克隆和浅克隆

    为什么要克隆 首先思考一个问题, 为什么需要克隆对象? 直接new一个对象不行吗?...简单说, 浅克隆克隆当前对象, 而不克隆当前对象所引用的对象. 克隆: 被克隆对象里的所有变量值都与原来的对象相同, 那些引用其他对象的变量将指向被复制过的新对象, 而不再是原来被引用的对象....简单说, 克隆不仅克隆了当前对象, 还把当前对象所引用的对象都复制了一遍. Object中的clone Object类中的clone()方法属于浅克隆....Java中实现克隆 将类中的所有引用类型都进行clone, 并重写对象clone()方法, 对所有引用类型进行clone. 代码如下: ? 将所有引用类型都进行clone, 实现了克隆....由于Java序列化的过程中, 写在流中的是对象一个拷贝, 而原对象仍然在JVM中, 所以可以利用这个原理来实现对对象克隆. 上面代码使用序列化实现如下: ?

    1.7K10

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

    Java支持我们对一个对象进行克隆,通常用在装饰模式和原型模式中。那么什么是克隆,什么是浅克隆呢。   【浅克隆】,通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的。   ...【克隆】,克隆的时候会复制它的子对象的引用,里面所有的变量和子对象都是又额外拷贝了一份。   下面的两个例子可以很好的说明他们的区别:   首先看一下类图 ?   ...Husband类有一个对wife的引用,当进行浅克隆的时,wife变量都会指向同一个Wife;而进行克隆时,会指向不同的Wife。...43 public Date getBirthday(){ 44 return birthday; 45 } 46 /** 47 * 浅克隆一个对象...}finally{ 56 return husband; 57 } 58 } 59 /** 60 * 利用串行化克隆一个对象

    1K70

    1-02 克隆与浅克隆

    真正实现了clone方法的是java.lang.Object父类 由此可见,每一个类都是有clone()方法的 但是这个clone()只是一个克隆方法 浅克隆定义: 复制出来的对象的所有变量都含有与原来的对象相同的值...,而所有的对其他对象的引用仍然指向原来的对象 克隆定义: 复制出来的所有变量都含有与原来的对象相同的值,那些引用其他对象的变量将指向复制出来的新对象,而不再是原有的那些被引用的对象....换言之,克隆把要克隆对象所引用的对象克隆了一遍 图解 浅克隆 ? 克隆 ?...,克隆对象虽然值一样,但是从内存上看 已经是不同的内存地址了 System.out.println("克隆"+(clone == another)); System.out.println...("克隆"+clone.hashCode()); // 克隆对象 里面成员属性的 地址应该是不一样的, 所以这里equals应该还是false System.out.println(

    1.4K10

    JAVA中的浅克隆克隆分析

    无论是在java面试过程中,还是在与各种老鸟交流的过程中,对java对象的深浅拷贝,都是一个绕不开的问题,这个问题看似很容易,却是大多数人用来区分小白的标准问题。现在对该问题进行说明。...1.定义 浅克隆(拷贝):复制一个对象的实例,但是这个对象中包含的其它的对象还是共用的。一般用super.clone()方法,clone的对象就是浅克隆。...克隆(拷贝):复制一个对象的实例,而且这个对象中包含的其它的对象也要复制一份。...如果使用clone(),那么需要对clone方法进行重写,复制一个对象super.clone(),之后再一一对属性进行复制。这样显得非常冗余,幸好,在java中还可以通过流来实现。...当然,实现克隆的方法并不局限于流这一种办法,还可以通过json等其他办法实现。

    86620

    JS专栏】JS对象的浅拷贝与拷贝

    1. object.assign object.assign 是 ES6 中 Object 的一个方法,该方法可以用于JS 对象的合并等多个用途,其中一个用途就是可以进行浅拷贝。...如果存在对象的嵌套,那么浅拷贝将无能为力。因此拷贝就是为了解决这个问题而生的,它能解决多层对象嵌套问题,彻底实现拷贝。...拷贝则不同,对于复杂引用数据类型,其在堆内存中完全开辟了一块内存地址,并将原有的对象完全复制过来存放。 拷贝后的对象与原始对象是相互独立、不受影响的,彻底实现了内存上的分离。...总的来说,拷贝的原理可以总结如下: 将原对象从内存中完整地拷贝出来一份给新对象,并从堆内存中开辟一个全新的空间存放新对象,且新对象的修改并不会改变原对象,二者实现真正的分离。 1....实现拷贝方法 下面是一个实现 deepClone 函数封装的例子,有几点需要注意下。

    2.3K40

    如何复制一个java对象(浅克隆与深度克隆

    然后把这个克隆出来的对象公开给别人访问,这样保证了目标对象的封装和它的不可改变。那么怎么去克隆一个对象呢?    ...首先举一个简单的对象克隆例子,有一个Person对象,它有三个属性: public class Person { private int age; private String name;...deepClone方法,该方法将对象序列化后再反序列化,然后得到了一个新的Person对象,下面来验证一下这个新的对象是否是完全的克隆。...这种序列化后反序列化的克隆方法,非常的简单,不需要再一一赋值,也不需要去一个个的实现clone方法,就可以完整的克隆出新对象,实在是大大有利于我们的开发工作。...该文章详细介绍了对象克隆,在大型项目开发中会很常用的一个功能点。

    4.2K10
    领券