深入JAVA对象深度克隆的详解

 更新时间:2013年05月17日 09:52:26   作者:  
本篇文章是对JAVA对象深度克隆进行了详细的分析介绍,需要的朋友参考下
有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值!

也许你会说,用clone()不就行了?!你的想法只对了一半,因为用clone()时,除了基础数据和String类型的不受影响外,其他复杂类型(如集合、对象等)还是会受到影响的!除非你对每个对象里的复杂类型又进行了clone(),但是如果一个对象的层次非常深,那么clone()起来非常复杂,还有可能出现遗漏!
既然用等号和clone()复制对象都会对原来对象产生影响,那么应该怎么做才能实现复制后的对象不对原来对象有任何影响呢?

实很简单,用对象的深度克隆,这种克隆实现了克隆后的对象和原来的对象是独立开来的!
对象的深度克隆原理:将对象序列化后写在输出流里,因为写在流里面的对象是一份拷贝,原对象仍然在JVM里;然后再把输出流转换为输入流,把对象反序列化后写出来!这样就实现了对象的深度克隆,克隆后的两个对象完全独立开来,互不影响!

你会发现对象的深度克隆其实是利用的对象的序列化和反序列化,所以要进行深度克隆的对象都要实现Serializable接口!

进行深度克隆的实现代码如下:
复制代码 代码如下:

public Object copy() throws IOException, ClassNotFoundException{
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   ObjectOutputStream oos = new ObjectOutputStream(bos);
   oos.writeObject(this);
   ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
   return ois.readObject();
  }

相关文章

  • IDEA的Mybatis Generator驼峰配置问题

    IDEA的Mybatis Generator驼峰配置问题

    这篇文章主要介绍了IDEA的Mybatis Generator驼峰配置问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Mybatis多线程下如何使用Example详解

    Mybatis多线程下如何使用Example详解

    这篇文章主要给大家介绍了关于Mybatis多线程下如何使用Example的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • Java如何将字符串String转换为整型Int

    Java如何将字符串String转换为整型Int

    这篇文章主要介绍了Java如何将字符串String转换为整型Int,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • 解释为什么Java中“1000==1000”为false而”100==100“为true

    解释为什么Java中“1000==1000”为false而”100==100“为true

    在日常编程中,我们经常遇到一些看似简单却隐藏着复杂逻辑的问题,这篇文章主要介绍了解释为什么Java中“1000==1000”为false而”100==100“为true,需要的朋友可以参考下
    2024-01-01
  • 基于SpringBoot和MongoDB实现实时分析和日志处理功能

    基于SpringBoot和MongoDB实现实时分析和日志处理功能

    实时分析和日志处理在现代应用程序开发中扮演着重要的角色,MongoDB是一个非常流行的NoSQL数据库,其高性能和灵活性使其成为实时分析和日志处理的理想选择,本文将介绍如何使用 Spring Boot 和 MongoDB 实现实时分析和日志处理的功能
    2023-06-06
  • Idea去除方法形参参数提示的操作

    Idea去除方法形参参数提示的操作

    这篇文章主要介绍了Idea去除方法形参参数提示的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • java -jar/-cp启动添加外部的依赖包方式

    java -jar/-cp启动添加外部的依赖包方式

    这篇文章主要介绍了java -jar/-cp启动添加外部的依赖包方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Java基础总结之Thymeleaf详解

    Java基础总结之Thymeleaf详解

    Thymeleaf是一种现代的基于服务器端的Java模板引擎技术,也是一个优秀的面向Java的XML、XHTML、HTML5页面模板,它具有丰富的标签语言、函数和表达式,在使用Spring Boot框架进行页面设计时,一般会选择Thymeleaf模板,需要的朋友可以参考下
    2021-05-05
  • SpringMVC中处理Http请求的原理详解

    SpringMVC中处理Http请求的原理详解

    这篇文章主要介绍了SpringMVC中处理Http请求的原理详解,当一个http请求过来了首先经过的是DispatcherServlet这么一个前端控制器并调用了这个前端控制器的doService方法,这个方法最终我们发现它调用了doDispatcher这么一个方法,需要的朋友可以参考下
    2023-12-12
  • 往DAO类中注入@PersistenceContext和@Resource的区别详解

    往DAO类中注入@PersistenceContext和@Resource的区别详解

    这篇文章主要介绍了往DAO类中注入@PersistenceContext和@Resource的区别详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论