Java对象深复制与浅复制实例详解

我们在遇到一些业务场景的时候经常需要对对象进行复制,对于对象的复制一般有两种方式,深复制和浅复制
浅复制:对象的复制仅是对象本身,对象引用的其它对方并不会复制。
深复制:对象的复制包含对象引用的对象。
Java所有对象的基类提供了clone方法,但是这个方法是protected native修饰,因此只暴露给之类去重写,外部是无法直接调用的。
我们现在来测试两种复制,首选是浅复制,浅复制要实现Cloneable接口。
// 课程对象
class Class {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 学生对象
class User implements Cloneable {
private String name;
private Long id;
// 课程引用
private Class c;
public Class getC() {
return c;
}
public void setC(Class c) {
this.c = c;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof User) {
User user = (User) obj;
if (this.id == user.getId() && this.getName() == user.getName()) {
return true;
}
if (user.getId().equals(this.id)
&& user.getName().equals(this.name)) {
return true;
}
return false;
} else
return false;
}
}
我们来测试:
User user1 = new User();
User user2 = user1;
User user3 = (User) user1.clone();
System.out.println(user1 == user2);
System.out.println(user3 == user1);
System.out.println(user3.equals(user1));
System.out.println(user3.getName() == user3.getName());// true,浅复制
Class c = new Class();
c.setName("语文");
user1.setC(c);
// 测试复制深度
User user4 = (User) user1.clone();
System.out.println(user4.getC() == user1.getC()); // true,说明引用的对象依然是同一个对象
对象的复制并没复制引用所指向的对象class,复制出来的引用指向的同一个地址。
深复制采用序列化与反序列的方式去获取,也有种说法类似于腌菜,用流的方式腌制进去又取出来,实现深度复制。
class Car implements Serializable {
/**
*
*/
private static final long serialVersionUID = 42342L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 深复制
class People implements Serializable{
/**
*
*/
private static final long serialVersionUID = 543535212412L;
private Car car;
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public People deepClone() throws IOException, ClassNotFoundException {
// 腌制
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(this);
// 取出
ByteArrayInputStream input = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream ois = new ObjectInputStream(input);
return (People) ois.readObject();
}
}
测试深复制:
// 深复制
Car car = new Car();
car.setName("benz");
People p = new People();
p.setCar(car);
try {
People p2 = p.deepClone();
System.out.println(p2.getCar() == p.getCar()); // false,说明引用的对象也进行了复制
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
例外提及一下生成对象的五种办法:
1.new
2.Class类的newInstance
3.Constructor类newInstance
4.Clone方式
5.反序列化的方式
其中2与3即是反射的方式。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java对象深复制与浅复制
# java
# 对象复制
# 利用Java反射机制实现对象相同字段的复制操作
# Java对象的复制三种方式(小结)
# Java编程实现对象克隆(复制)代码详解
# Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍
# 深入java对象复制的分析
# Java基础之面向对象机制(多态、继承)底层实现
# Java MapStruct解了对象映射的毒
# 详解Java对象的内存布局
# Java基础详解之面向对象的那些事儿
# 深入理解Java对象复制
# 两种
# 希望能
# 仅是
# 重写
# 我们现在
# 即是
# 有两种
# 谢谢大家
# 类似于
# 五种
# 进行了
# 化与
# 直接调用
# 序列化
# Override
# Object
# getId
# implements
# setC
# getC
相关文章:
如何选择可靠的免备案建站服务器?
如何高效搭建专业期货交易平台网站?
如何安全更换建站之星模板并保留数据?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
如何在IIS中新建站点并配置端口与IP地址?
网站图片在线制作软件,怎么在图片上做链接?
学校建站服务器如何选型才能满足性能需求?
制作营销网站公司,淘特是干什么用的?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
深圳网站制作平台,深圳市做网站好的公司有哪些?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
javascript基本数据类型及类型检测常用方法小结
*服务器网站为何频现安全漏洞?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何快速搭建二级域名独立网站?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
如何在IIS中新建站点并配置端口与物理路径?
建站主机服务器选型指南与性能优化方案解析
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
C++中引用和指针有什么区别?(代码说明)
公司门户网站制作流程,华为官网怎么做?
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何在阿里云部署织梦网站?
教学网站制作软件,学习*后期制作的网站有哪些?
网站制作难吗安全吗,做一个网站需要多久时间?
独立制作一个网站多少钱,建立网站需要花多少钱?
如何制作算命网站,怎么注册算命网站?
Java解压缩zip - 解压缩多个文件或文件夹实例
宝塔面板创建网站无法访问?如何快速排查修复?
建站之星后台管理:高效配置与模板优化提升用户体验
网站app免费制作软件,能免费看各大网站视频的手机app?
开封网站制作公司,网络用语开封是什么意思?
郑州企业网站制作公司,郑州招聘网站有哪些?
如何在IIS服务器上快速部署高效网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
北京网站制作网页,网站升级改版需要多久?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
湖北网站制作公司有哪些,湖北清能集团官网?
建站之星客服服务时间及联系方式如何?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
香港服务器选型指南:免备案配置与高效建站方案解析
linux top下的 minerd 木马清除方法
如何选择香港主机高效搭建外贸独立站?
建站之星如何助力网站排名飙升?揭秘高效技巧
济南专业网站制作公司,济南信息工程学校怎么样?
如何在IIS7中新建站点?详细步骤解析
*请认真填写需求信息,我们会在24小时内与您取得联系。