正文
java代码里的深拷贝 java深拷贝的实现方式
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
JAVA 中浅拷贝与深拷贝有什么区别?
浅拷贝 指java代码里的深拷贝的是java代码里的深拷贝你的类本身被拷贝,而没有拷贝类本身属性中的类
深拷贝 指的是包含类本身和属性类在内的所有类的拷贝。
简单点说:
就是浅拷贝的两个对象中的属性还会指向同一个类,而深拷贝则全部单独java代码里的深拷贝了。也就是说深拷贝把关联关系也拷贝java代码里的深拷贝了。
具体例子你可以参看我的blog,里面篇文章介绍:)
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如何实现对象的深克隆?
/**定义用户**/
publicclassUser{
privateStringname;
privateAddressaddress;
//constructors,gettersandsetters
}
/**地址**/
publicclassAddress{
privateStringcity;
privateStringcountry;
//constructors,gettersandsetters
}
重载clone()方法
Object父类有个clone()的拷贝方法,不过它是protected类型的,
我们需要重写它并修改为public类型。
除此之外,子类还需要实现Cloneable接口来告诉JVM这个类是可以拷贝的。
重写代码
让我们修改一下User类,Address类,实现Cloneable接口,使其支持深拷贝。
/**
*地址
*/
publicclassAddressimplementsCloneable{
privateStringcity;
privateStringcountry;
//constructors,gettersandsetters
@Override
publicAddressclone()throwsCloneNotSupportedException{
return(Address)super.clone();
}
}
/**
*用户
*/
publicclassUserimplementsCloneable{
privateStringname;
privateAddressaddress;
//constructors,gettersandsetters
@Override
publicUserclone()throwsCloneNotSupportedException{
Useruser=(User)super.clone();
user.setAddress(this.address.clone());
returnuser;
}
}
需要注意的是,super.clone()其实是浅拷贝,
所以在重写User类的clone()方法时,address对象需要调用address.clone()重新赋值。
扩展:
为什么要克隆?
大家先思考一个问题,为什么需要克隆对象?直接new一个对象不行吗?
答案是:克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。
提个醒,我们常见的Objecta=newObject();Objectb;b=a;这种形式的代码复制的是引用,即对象在内存中的地址,a和b对象仍然指向了同一个对象。
而通过clone方法赋值的对象跟原来的对象时同时独立存在的。
java代码里的深拷贝的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java深拷贝的实现方式、java代码里的深拷贝的信息别忘了在本站进行查找喔。