文档章节

Java中深复制和浅复制

wuxinshui
 wuxinshui
发布于 2017/02/28 11:12
字数 724
阅读 6
收藏 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面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide一 原型模式介绍 在面向对象系统中,使用原型模式来复制一个对象自...

Amsour丶
2018/06/19
0
0
java List复制:浅拷贝与深拷贝

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

丁佳辉
2017/11/08
0
0
23种设计模式(5):原型模式

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

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

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

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

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

苏叶晚晚
2013/02/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7 yum 安装git

CentOS7 yum 安装git 1.查看系统是否已经安装git 1 git --version 2.CentOS7 yum 安装git 1 yum install -y git 3.安装成功 4.卸载git 1 yum remove git  ...

linjin200
33分钟前
1
0
vue页面闪现源码的处理方法

1.添加样式 <style type="text/css"> [v-cloak] { display: none; } </style> 2.在app id上添加v-cloak指令 <div class="wrapper wrapper-content " id="app" v-cloak>......

qiang123
37分钟前
2
0
Hyperledger Fabric 实战(十二): Fabric 源码本地调试

借助开发网络调试 fabric 源码本地调试 准备工作 IDE Goland Go 1.9.7 fabric-samples 模块 chaincode-docker-devmode fabric 源码 步骤 添加本地域名 127.0.0.1 peer 127.0.0.1 orderer 用 ...

Jonluo
38分钟前
1
0
自然语言处理hanlp的入门基础

此文整理的基础是建立在hanlp较早版本的基础上的,虽然hanlp的最新1.7版本已经发布,但对于入门来说差别不大!分享一篇比较早的“旧文”给需要的朋友! 安装HanLP HanLP将数据与程序分离,给...

左手的倒影
40分钟前
1
0
KaliLinuxNetHunter教程实施刷机解锁Bootloader

KaliLinuxNetHunter教程实施刷机解锁Bootloader 当用户将前面的工作都准备完成后,即可开始刷机。其中,整个刷机过程分为三个步骤,分别是解锁Bootloader、刷入第三方Recovery和实施刷机。为...

大学霸
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部