本文目录一览:
- 1、JAVA 中浅拷贝与深拷贝有什么区别?
- 2、什么是深拷贝和浅拷贝
- 3、java深拷贝和浅拷贝的区别
- 4、谁能给出一个java中深拷贝 的例子 啊,我不知道是啥东西,最好能解释下深拷贝含义.
- 5、java中什么是深拷贝,什么是浅拷贝?
- 6、JAVA如何实现深拷贝
JAVA 中浅拷贝与深拷贝有什么区别?
浅拷贝 指的是你的类本身被拷贝,而没有拷贝类本身属性中的类
深拷贝 指的是包含类本身和属性类在内的所有类的拷贝。
简单点说:
就是浅拷贝的两个对象中的属性还会指向同一个类,而深拷贝则全部单独了。也就是说深拷贝把关联关系也拷贝了。
具体例子你可以参看我的blog,里面篇文章介绍:)
什么是深拷贝和浅拷贝
浅拷贝就是指对象复制的时候只复制一层;深拷贝是指复制对象的所有层级。
深拷贝和浅拷贝,主要是对象发生复制的时候,根据复制的层级不同来区分的。很多人在这里经常变量赋值发生混淆。对于JavaScript数组等复杂的数据类型来说,将其赋值给其它变量,其实只是复制了对象的地址给它,两个变量指向的是同一个对象,因此普通的赋值既不是深拷贝也不是浅拷贝。
深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝:
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去。
而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。
java深拷贝和浅拷贝的区别
浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制
深拷贝:对象,对象内部的引用均复制
示例:
public static Object copy(Object oldObj) {
Object obj = null;
try {
// Write the object out to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(oldObj);
out.flush();
out.close();
// Retrieve an input stream from the byte array and read
// a copy of the object back in.
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bis);
obj = in.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
return obj;
}
谁能给出一个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;
感觉如下:
浅拷贝只拷贝对象本身
深拷贝则拷贝对象中引用的对象,一直拷贝下去。
java中什么是深拷贝,什么是浅拷贝?
简单点跟你说吧,容易理解。
浅拷贝:
就是复制对象的值的时候,不管复制多少,所以的值都指向同一个对象。
深拷贝:
在复制对象的值的时候,同时也重新创建了一个对象,每个值都指向一个不同的对象。
如果你学习了c语言的指针,会理解的更深刻
JAVA如何实现深拷贝
下面给你简单介绍protected 域(或方法)实现过程思路:
protected 域(或方法)对本包内的所有类可见(当然包括子类),那么,子类可以获得访超类受保护域(或方法)的权利,但是,若子类和超类不在同一个包下,就不能访问超类对象的这个受保护域(或方法)。
浅拷贝与深拷贝
Object类对自己的具体子类的域一无所知,Object类的clone方法只是将各个域进行拷贝。数值或基本类型不会出现问题,但是,如果在对象中包含了引用对象,这些对象的内容没有被自我复制,拷贝的结果也即是原始对象和拷贝对象引用着同一个引用对象(一般地,动词“引用”可理解为“管理”,就是指向同一内存)。
浅拷贝满足:
x.clone() != x为 true,
x.clone().getClass() == x.getClass()为true,
((x.clone().field1 ) == (x. field1)) … ((x.clone().fieldN )==(x. fieldN))也为 true 。
如果原始对象与浅拷贝对象共同引用(管理、指向)的引用对象是不可变的,将不会产生任何问题
如果原始对象管理的引用对象是可变的,就必须需重新定义clone方法,来实现深层次的拷贝。要对涉及的每一个类,判断以下两点:
默认的clone方法是否满足需求。
默认的clone方法是否能通过调用可变引用对象的clone方法得到解决。
对涉及的每一个类,深拷贝要满足:
x.clone() != x为 true,
x.clone().getClass() == x.getClass()为true,
x.clone().equals(x)也为 true ,当然equals方法是如此重写过的。
Object类中的clone方法被声明为protected,防止出现文章开头所提到的,子类和超类不在同一个包下的情况,要声明clone为public,来实现深拷贝