JavaScript的数据类型简单数据类型stringnumberbooleanfunctionnullundefined复杂数据类型StringNumberBooleanFunctionDateArrayRegExpObject各种类型的深复制方式:先来看看简单类型的复制方式://string
var s1 = ‘abc‘;
var s2 = s1;
s2 = ‘ccc‘;
console.log(s1);//number
var n1 = 12.1;
var n2 = n1;
n2 = 7410;
console.log(n1);//boolean
var b1 = true;
var b2 = b1;
b2 = false;
console.log(b1);//null
var nu1 = n...
在有些业务场景下,我们需要两个完全相同却彼此无关的java对象。比如使用原型模式、多线程编程等。对此,java提供了深拷贝的概念。通过深度拷贝可以从源对象完美复制出一个相同却与源对象彼此独立的目标对象。这里的相同是指两个对象的状态和动作相同,彼此独立是指改变其中一个对象的状态不会影响到另外一个对象。实现深拷贝常用的实现方式有2种:Serializable,Cloneable。 Serializable方式就是通过java对象的序列化和反序...
1.前言之前的博文 Java 返回可变引用对象的相关问题中,对于可变变量,有使用 clone()方法,防止破坏封装,还没有较深入的介绍克隆方法,这篇博文将进一步介绍。2.clone()方法protected Object clone() throws CloneNotSupportedException创建并返回此对象的副本。 “复制”的确切含义可能取决于对象的类别。 一般意图是,对于任何对象x ,表达式为: x.clone() != x按照惯例,返回的对象应该通过调用super.clone获得。 如果一个...
Java深拷贝和浅拷贝 关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象。可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用传递将会有更深的理解。1、创建对象的5种方式 ①、通过 new 关键字 这是最常用的一种方式,通过 new 关键字调用类的有参或无参构造方法来创建对象。比如 Object obj = new Object(); ②、通过...
1、浅拷贝 对源对象克隆到一个新的对象,源对象的引用类型按值副本传递,基本类型属性仍然引用之前的地址副本,所以对新对象修改引用类型属性时, 源对象也会被修改。 实现步骤: 1)实现cloneable接口 2)重写Object的clone方法2、深拷贝 对源对象克隆到一个新的对象,新对象的基本类型和引用类型都会完整克隆一份新的,对新对象的引用类型修改不会影响到源对象。 实现方式: 1)被克隆类和属性引用类型都实现cloneab...
java对象克隆以及深拷贝和浅拷贝
1.什么是"克隆"?
在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在 Java语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高...
ArrayList 、 LinkedList等对象都可以用构造器传参的方式快速完成深拷贝。 如:
private List<List<Integer>> res = new ArrayList<>();
private List<Integer> temp = new ArrayList<>();
...
res.add(new ArrayList<Integer>(temp)); //传入需要拷贝的目标集合即可
浅拷贝:拷贝基本类型,引用类型指向与原来的一样
深拷贝:基本类型,引用类型都拷贝一份。
在查找几篇博客之后,之以为懂了深拷贝,浅拷贝,然后还是发现自己对于他们的理解还是出现了问题,
理解1:浅拷贝,深拷贝你调用了几次,就拷贝几次。
比如你调用一次clone方法,那么就拷贝一次,拷贝后就产生了各种的对象属性,不依赖原来的对象了。只是浅拷贝和原来的对象有牵连。
如图所示,浅拷贝会拷贝一个School2对象,只拷贝基本...
Java的浅拷贝与深拷贝
Java中,Object基类有clone方法,但是如果要使用该方法,必须在要被Clone的类实现(implements)Cloneable接口,否则会报java.lang.CloneNotSupportedException异常,Cloneable接口是在java.lang中自动被导入的。
如果不重写clone()方法,则在调用clone()方法实现的是浅复制(所有的引用对象保持不变,意思是如果原型里这些对象发生改变会直接影响到复制对象)。重写clone()方法,一般会先调用super.clone()进行...
/*** 深度复制list对象,先序列化对象,再反序列化对象** @param src 需要复制的对象列表* @return 返回新的对象列表* @throws IOException 读取Object流信息失败* @throws ClassNotFoundException 泛型类不存在*/public static <T> List<T> deepCopy(List<T> src)throws IOException, ClassNotFoundException{ByteArrayOutputStream byteOut = new ByteArrayOutputStream();ObjectOutputStream out = new ObjectOutputStream(byteO...
定义
浅拷贝
基本数据类型 拷贝数值
引用类型 拷贝对象引用
深拷贝
基本数据类型 拷贝数值
引用类型 拷贝引用所对应对象的所有数值
浅拷贝实现方式
1. 拷贝构造方法
拷贝构造方法指的是该类的构造方法参数为该类的对象。使用拷贝构造方法可以很好地完成浅拷贝,直接通过一个现有的对象创建出与该对象属性相同的新的对象。
实现如下(PS:已略去部分代码):
浅拷贝-拷贝构造
运行结果:Student{age=18, parent=Parent{age=40}}
St...
转载链接:https://juejin.im/post/5de7237a518825125015cd6d
这是今天我们在技术群里面讨论的一个知识点,讨论的相当激烈,由于对这一块使用的比较少,所以对这一块多少有些盲区。这篇文章总结了所讨论的内容,希望这篇文章对你有所帮助。在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值、浅拷贝、深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,...
我需要澄清深度拷贝,浅拷贝和Java中的克隆之间的区别解决方法:不幸的是,“浅拷贝”,“深拷贝”和“克隆”都是相当不明确的术语.
在Java上下文中,我们首先需要区分“复制值”和“复制对象”.int a = 1;
int b = a; // copying a value
int[] s = new int[]{42};
int[] t = s; // copying a value (the object reference for the array above)StringBuffer sb = new StringBuffer("Hi mom");// copying an object.
StringBuffe...
List 深拷贝
如图,深拷贝就是将A复制给B的同时,给B创建新的地址,再将地址A的内容传递到地址B。ListA与ListB内容一致,但是由于所指向的地址不同,所以改变相互不受影响。
深拷贝的方法
使用序列化方法public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteO...
在有些业务场景下,我们需要两个完全相同却彼此无关的java对象。比如使用原型模式、多线程编程等。对此,java提供了深拷贝的概念。通过深度拷贝可以从源对象完美复制出一个相同却与源对象彼此独立的目标对象。这里的相同是指两个对象的状态和动作相同,彼此独立是指改变其中一个对象的状态不会影响到另外一个对象。实现深拷贝常用的实现方式有2种:Serializable,Cloneable。 Serializable方式就是通过java对象的序列化和反序...