java对象拷贝主要有四种方法,Java 对象拷贝
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
为什么要使用克隆?(推荐学习:java常见面试题)
想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了,Java语言中克隆针对的是类的实例。
如何实现对象克隆?
有两种方式:
实现可克隆的接口并重写目标类中的克隆()方法;实现可序列化接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下:
导入Java。io。bytearray inputstream
导入Java。io。bytearrayoutputstream
导入Java。io。objectinputstream
导入Java。io。对象输出流;
导入Java。io。可序列化;
公共类MyUtil {
private MyUtil() {
抛出新的断言错误();
}
@SuppressWarnings(未选中)
公共静态T扩展可序列化T克隆(obj)引发异常{
ByteArrayOutputStream bout=new ByteArrayOutputStream();
对象输出流OOS=新对象输出流(bout);
OOS。writeobject(obj);
bytearray inputstream bin=new bytearray inputstream(bout。tobytearray());
ObjectInputStream ois=新的ObjectInputStream(bin);
返回ois。read object();
//说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的关闭方法没有任何意义
//这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放
}
}下面是测试代码:
导入Java。io。可序列化;
/**
* 人类
* @作者nnngu
*
*/
类人实现可序列化{
private static final long serialVersionUID=-9102017020286042305 l;
私有字符串名称;//姓名
私人年龄;//年龄
私家车汽车;//座驾
公众人物(字符串名称,年龄,汽车汽车){
this.name=name
this.age=年龄;
this.car=汽车;
}
公共字符串getName() {
返回名称;
}
公共void集合名称(字符串名){
this.name=name
}
public int getAge() {
回归年龄;
}
公共无效存储(整数){
this.age=年龄;
}
公共汽车getCar() {
还车;
}
公共void setCar(汽车汽车){
this.car=汽车;
}
@覆盖
公共字符串toString() {
return Person [name= name ,age= age ,car= car ];
}
}/**
* 小汽车类
* @作者nnngu
*
*/
类汽车实现可序列化{
private static final long serial版本uid=-5713945027627603702 l;
私人串串品牌;//品牌
private int maxSpeed//最高时速
公共汽车(字符串品牌,int maxSpeed) {
this.brand=品牌;
这个。最大速度=最大速度;
}
公共字符串getBrand() {
回归品牌;
}
public void setBrand(字符串品牌){
this.brand=品牌;
}
public int getMaxSpeed() {
返回最大速度
}
public void setMaxSpeed(int maxSpeed){
这个。最大速度=最大速度;
}
@覆盖
公共字符串toString() {
return Car [brand= brand ,maxSpeed= maxSpeed ];
}
}类克隆测试{
公共静态void main(String[] args) {
尝试{
人员p1=新人员(郭靖,33,新车(奔驰,300));
人员p2=我的util。克隆(P1);//深度克隆
p2.getCar().设置品牌(比亚迪);
//修改克隆的人对象p2关联的汽车对象的品牌属性
//原来的人对象第一亲代关联的汽车不会受到任何影响
//因为在克隆人对象时其关联的汽车对象也被克隆了
系统。出去。println(P1);
} catch(异常e) {
e。printstacktrace();
}
}
}注意:基于序列化和反序列化的克隆不仅是深度克隆,更重要的是可以通过泛型限定来检查要克隆的对象是否支持序列化。这种检查是由编译器完成的,而不是在运行时抛出异常。这种方案明显优于使用对象类的克隆方法克隆对象。让问题在编译时暴露出来总比让它在运行时暴露出来好。
深拷贝和浅拷贝区别是什么?
浅拷贝只拷贝一个对象的引用地址,两个对象指向同一个内存地址,所以你修改其中任何一个,另一个值都会改变。这是一个浅层拷贝(例如:assign())。深层副本复制对象及其值,如果两个对象修改其中任何一个,另一个值不会改变。这是一个深层副本(例如:JSON.parse()和JSON.stringify()
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。