文档章节

Java中深复制和浅复制

wuxinshui
 wuxinshui
发布于 2017/02/28 11:12
字数 724
阅读 4
收藏 0

关于Java中的深复制、浅复制,网上也有很多资料解释,这里整理出来加入一些自己的想法。

浅复制

什么是浅复制

浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

网上资料说:

若不对clone()方法进行改写,则调用此方法得到的对象即为浅拷贝,下面我们着重谈一下深拷贝。

经验证,引用类型的类是否重写clone()都不影响浅复制。这个不是关键点。以下是完整代码,感兴趣的同学可以验证。

代码

public class Student implements Cloneable {
    private int age;
    private String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    /** * 重写Object的clone方法实现深复制 * @return */
    @Override
    protected Object clone() {
        Object o=null;
        try {
            o=super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }
    get、set省略
  }
public class Classroom implements Cloneable{
    private int roomNum;
    private String roomName;
    private Student stu;

    public Classroom(int roomNum, String roomName, Student stu) {
        this.roomNum = roomNum;
        this.roomName = roomName;
        this.stu = stu;
    }

    @Override
    protected Object clone()  {
        Object o=null;
        try {
            o=super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }
    get、set省略
}

测试

经测试,引用类型的类Student是否重写clone()都不影响复制的结果。

这里写图片描述

深复制

什么是深复制

深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。

代码

深复制,对Classroom中的clone()进行如下重写。此时引用对象Student必须重写方法clone();这是因为基础类中的clone方法是protect的。

   protected native Object clone() throws CloneNotSupportedException;
    /** * 深复制 * @return */
    @Override
    protected Object clone()  {
        Classroom classroom=null;
        try {
            classroom=(Classroom)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        //关键代码 copy对象的引用
        classroom.stu=(Student)stu.clone();
        return classroom;
    }

测试

这里写图片描述

结论

  1. 深复制是完全复制一个对象,类似新建一个对象!浅复制只是复制引用类型的内存地址。
  2. 浅复制、深复制的主要差别在引用类型的复制上。
  3. 基本数据类型在深复制、浅复制中直接复制了值。

扩展

序列化也可以实现深复制,是通过IO流实现的,开销比较大。有大神写了个类直接继承就可以实现深复制。这种方法可以提高代码的复用。

参考:
Java中的深拷贝(深复制)和浅拷贝(浅复制)
Java的一个高性能快速深拷贝方法。Cloneable?
Java中的深拷贝和浅拷贝介绍

© 著作权归作者所有

共有 人打赏支持
wuxinshui
粉丝 2
博文 65
码字总数 33475
作品 0
普陀
程序员
私信 提问
java List复制:浅拷贝与深拷贝

List浅拷贝 众所周知,list本质上是数组,而数组的是以地址的形式进行存储。 如上图将list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指向同一...

丁佳辉
2017/11/08
0
0
深入理解原型模式 ——通过复制生成实例

Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide一 原型模式介绍 在面向对象系统中,使用原型模式来复制一个对象自...

Amsour丶
06/19
0
0
23种设计模式(5):原型模式

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型:创建类模式 类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具...

LCZ777
2014/07/05
0
0
JAVA深复制(深克隆)与浅复制(浅克隆)

1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不 复制...

MZHS
2013/07/22
0
4
JAVA深复制(深克隆)与浅复制(浅克隆)

1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不 复制...

gavin_jin
2013/01/15
0
1

没有更多内容

加载失败,请刷新页面

加载更多

自定义Maven插件功能

自定义maven插件 创建一个maven 项目 通过上述方式创建,会自动引入maven-plugin-api 依赖和打包方式;如下 <packaging>maven-plugin</packaging><dependency> <groupId>org.apache.mave......

春哥大魔王的博客
29分钟前
2
0
和平之翼代码生成器SMEU版5.0-7.0项目代号初稿兼征求意见

现在,和平之翼代码生成器SMEU 4.0 宝船 Treasure Ship已经开始研发。是规划下一代代码生成器项目代号和功能清单的时候了。 宝船: 这是我初步的计划,欢迎您的意见: 和平之翼SMEU 5.0 福船...

火箭船
39分钟前
1
0
0016-Avro序列化&反序列化和Spark读取Avro数据

1.简介 本篇文章主要讲如何使用java生成Avro格式数据以及如何通过spark将Avro数据文件转换成DataSet和DataFrame进行操作。 1.1Apache Arvo是什么? Apache Avro 是一个数据序列化系统,Avro提...

Hadoop实操
51分钟前
1
0
访问日志不记录静态文件、切割和静态元素过期时间

11月16日任务 11.22 访问日志不记录静态文件 11.23 访问日志切割 11.24 静态元素过期时间 1. 访问日志不记录静态文件 示例一: 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用...

hhpuppy
57分钟前
2
0
day151-2018-11-18-英语流利阅读-待学习

后双十一时代阿里将何去何从? Daniel 2018-11-18 1.今日导读 “这么便宜,我要买下来,统统都要买下来!” 这个双十一,你剁手了吗?据说阿里巴巴天猫在刚过去的双十一里单日销售额再创新高...

飞鱼说编程
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部