首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试题-JAVA中的深拷贝、浅拷贝原理及实现

面试题-JAVA中的深拷贝、浅拷贝原理及实现

作者头像
别明天就今天吧
发布2020-09-07 01:17:48
发布2020-09-07 01:17:48
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

我们在日常编码中,肯定会遇到对象拷贝的问题,比如接口的入参RequestDTO,我们在接收到入参DTO后,进行逻辑处理这时就需要把入参DTO拷贝给业务处理DTO,但是拷贝后,对两个DTO的修改是否会对彼此产生影响,我们来带着这个疑问先了解下深浅拷贝的原理,在说说实战中是怎么拷贝的。

浅拷贝:

我们都知道JAVA数据类型分为基本数据类型和引用数据类型,对于浅拷贝来说,它会创建一个新的对象,如果对象中的属性是基本数据类型则拷贝值,如果是引用数据类型则拷贝内存地址,也就意味着任何一个对象改变都会对其他产生影响。

浅拷贝图:

浅拷贝的实现:

1.实现Cloneable接口,重写clone方法

代码语言:javascript
代码运行次数:0
运行
复制
@Override
public Object clone() {
    try {
        return super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
        return null;
    }
}2.BeanUtils.copyProperties(a,b)BeanUtils.copyProperties(原对象,拷贝对象);

浅拷贝的弊端就是当你只想修改某一个拷贝对象的引用数据类型属性,原对象和其他拷贝对象受到影响。

深拷贝:

深拷贝与浅拷贝的不同之处在于,无论是基本数据类型对象还是引用数据类型对象都是独立的,相当于重新创建了一份对象,成为两个独立的个体。

深拷贝图:

深拷贝的实现:

代码语言:javascript
代码运行次数:0
运行
复制
1.对象的多层引用对象都需要实现Cloneable接口,重写clone方法.
@Override
public Object clone() {
    //深拷贝
    try {
        // 直接调用父类的clone()方法
        Student student = (Student) super.clone();
        student.引用对象 = (引用对象) 引用对象.clone();
        return student;
    } catch (CloneNotSupportedException e) {
        return null;
    }
}
 
代码语言:javascript
代码运行次数:0
运行
复制
2.对象序列化后,再反序列化后生成的对象.
//将对象写入流中
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(拷贝对象);
//从流中取出
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
return (拷贝对象)objectInputStream.readObject();
代码语言:javascript
代码运行次数:0
运行
复制
3.JSON方式
String json =JSON.toJSONString(src);
T object = JSON.parseObject(json, clazz);
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 别明天就今天吧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档