「java如何创建深拷贝」java的深浅拷贝
今天给各位分享java如何创建深拷贝的知识,其中也会对java的深浅拷贝进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
实现list的深拷贝
这时,获取source.get(0)的name值,也变成了“CDE”。
为了解决这个问题,使得改变copy中的值,不影响source中的数据,则要进行深拷贝。
即,对A类实现clone()方法:
然后,
就可以进行深拷贝了。
在此,再多描述一下关于Clone的内容。
Java对对象和基本数据类型的处理是不一样的。在Java中用对象作为入口参数的传递则缺省为“引用传递”,也就是说仅仅传递了对象的一个“引用”,这个引用的概念与C语言中的指针引用是一样的。当函数体内部对这个变量进行改变时,实质上就是对这个对象进行直接操作。
除此之外,在任何用“=”向对象变量赋值的时候都是“引用传递”。
一、当Class A的成员变量类型是基本数据类型(外加String类型)时,只要实现如上简单的clone(称影子clone)就可以。但是如果Class A的成员变量是数组或者更复杂类型时,就必须实现深度clone。
此处的A的成员变量String[],影子clone对name数组clone他们的地址,需进行深拷贝。
二、需要注意的是,Class A存在更为复杂的成员变量时,如Vector等存储对象地址的容器时,就必须clone彻底。
谁能给出一个java中深拷贝 的例子 啊,我不知道是啥东西,最好能解释下深拷贝含义.
举个最简单的例子:
class A {
public int i;
public int j;
}
A a = new A();
浅拷贝:
A a1 = a;
深拷贝:
A a1 = new A();
a1.i = a.i;
a1.j = a.j;
感觉如下:
浅拷贝只拷贝对象本身
深拷贝则拷贝对象中引用的对象,一直拷贝下去。
什么是深拷贝和浅拷贝
浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。
深拷贝和浅拷贝,主要是对象发生复制的时候,根据复制的层级不同来区分的。很多人在这里经常变量赋值发生混淆。对于JavaScript数组等复杂的数据类型来说,将其赋值给其它变量,其实只是复制了对象的地址给它,两个变量指向的是同一个对象,因此普通的赋值既不是深拷贝也不是浅拷贝。
深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝:
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去。
而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。
如何使Java中的InputStream的深层复制
InputStream的是抽象的,不公开(没有尽自己的孩子)的内部数据对象。所以唯一的办法,以“深拷贝”InputStream的是创造ByteArrayOutputStream后执行Read()上的InputStream,写(),该数据ByteArrayOutputStream。然后做: 方通=新ByteArrayInputStream的(byteArrayOutputStream.toArray());
如果您使用的是标记()您的InputStream那么你的确不能扭转这一点。这使你流“消费”。
要“重用”你的InputStream避免使用标记(),然后在阅读呼叫复位结束()。您会然后读取来自流的开头。
编辑:
顺便说一句,IOUtils使用这个简单的code片段复制的InputStream:
公共静态INT副本(输入的InputStream,OutputStream的输出)抛出IOException异常{
byte []的缓冲区=新的字节[DEFAULT_BUFFER_SIZE]
诠释计数= 0;
INT N = 0;
而(-1!=(N = input.read(缓冲液))){
output.write(缓冲液,0,n)的;
数+ = N;
}
返回计数;
}
关于java如何创建深拷贝和java的深浅拷贝的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。