对象的深度复制

首先什么是深度复制?什么又是浅复制?

百度告诉我--------------->

浅复制:将一个对象复制后,基本类型都会重新创建,而引用类型指向的还是原对象所指的引用;

深复制:讲一个对象复制后,不论是基本类型还是引用类型都是重新创建的。


下面看我们的深度复制方法

package everyworkdayprogramming._2015_3_03;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;/*** * 在使用对象流对对象进行深度复制的时候对象必须实现Cloneable,Serializable接口* 前者标明对象是可以被复制的,后者则是为了能够满足我们使用对象流对对象进行深度复制* * */
public class CopySource implements Cloneable, Serializable {/*** @Fields serialVersionUID : 对象的序列化唯一标识*/private static final long serialVersionUID = -3446490540857082055L;/* 定义连个变量,不是基本类型,而且都实现了Serializable 接口 */private String string;private SerializableObject serializableObject;public String getString() {return string;}public void setString(String string) {this.string = string;}public SerializableObject getSerializableObject() {return serializableObject;}public void setSerializableObject(SerializableObject serializableObject) {this.serializableObject = serializableObject;}/* 浅复制 */public Object clone() throws CloneNotSupportedException {/* 浅复制直接调用父类的clone方法就可以进行复制 */CopySource copySource = (CopySource) super.clone();return copySource;}/* 深复制 */public Object deepClone() throws IOException, ClassNotFoundException {/* 写入当前对象的二进制流 */ByteArrayOutputStream out = new ByteArrayOutputStream();ObjectOutputStream oout = new ObjectOutputStream(out);oout.writeObject(this);/* 读出二进制流产生的新对象 */ObjectInputStream oin = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray()));/* 这样我们的深度复制工作就完成了;所有对象都是新的 */return oin.readObject();}}/*** * 该类包含在CopySource中,用于测试是否对类的实例中的该对象进行了深度复制* * */
class SerializableObject implements Serializable {/*** @Fields serialVersionUID : 对象的序列化唯一标识*/private static final long serialVersionUID = 6357352492173107445L;/* 一下的属性用于测试对象中的对象中的对象是否还可以被深度复制 *//* 基本类型 */private int x = 1;/* 非基本类型 */private Date date;private SerializableObject1 serializableObject1;public int getX() {return x;}public void setX(int x) {this.x = x;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public SerializableObject1 getSerializableObject1() {return serializableObject1;}public void setSerializableObject1(SerializableObject1 serializableObject1) {this.serializableObject1 = serializableObject1;}}/*** * 对象中的对象中的对象,当然也实现了Serializable* * */
class SerializableObject1 implements Serializable {/*** @Fields serialVersionUID : 对象的序列化唯一标识*/private static final long serialVersionUID = 1L;}


测试方法:


package everyworkdayprogramming._2015_3_03;import java.io.IOException;
import java.util.Date;public class Test {public static void main(String[] args) {/* 创建要被复制的对象,并初始化相应属性 */CopySource copy = new CopySource();copy.setSerializableObject(new SerializableObject());copy.setString("123");copy.getSerializableObject().setX(2);copy.getSerializableObject().setDate(new Date());copy.getSerializableObject().setSerializableObject1(new SerializableObject1());try {/* 浅复制copy 到 copy1 */CopySource copy1 = (CopySource) copy.clone();/* 深复制copy 到 copy2 */CopySource copy2 = (CopySource) copy.deepClone();/* 判断SerialiableObject在浅复制和深复制后是否与原对象中的相等 */System.out.println("----------------------------------------------------------判断SerialiableObject在浅复制和深复制后是否与原对象中的相等");System.out.println(copy.getSerializableObject() == copy1.getSerializableObject());System.out.println(copy.getSerializableObject() == copy2.getSerializableObject());/* 判断string在浅复制和深复制后是否与原对象的相等 */System.out.println("----------------------------------------------------------判断string在浅复制和深复制后是否与原对象的相等");System.out.println(copy.getString() == copy1.getString());System.out.println(copy.getString() == copy2.getString());/* 判断SerializableObject中的DATE在浅复制和深复制后是否与原对象相等 */System.out.println("----------------------------------------------------------判断SerializableObject中的DATE在浅复制和深复制后是否与原对象相等 ");System.out.println(copy.getSerializableObject().getDate() == copy1.getSerializableObject().getDate());System.out.println(copy.getSerializableObject().getDate() == copy2.getSerializableObject().getDate());/* 判断SerializableObject中的SerializableObject1在浅复制和深复制后是否与原对象相等 */System.out.println("----------------------------------------------------------判断SerializableObject中的SerializableObject1在浅复制和深复制后是否与原对象相等");System.out.println(copy.getSerializableObject().getSerializableObject1() == copy1.getSerializableObject().getSerializableObject1());System.out.println(copy.getSerializableObject().getSerializableObject1() == copy2.getSerializableObject().getSerializableObject1());} catch (CloneNotSupportedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}
}

测试结果



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在idea中使用Mybatis-generator插件快速生成代码

代码下载地址&#xff1a;https://download.csdn.net/download/hua_faded/10671547 一、配置Maven pom.xml 文件 在pom.xml增加以下插件&#xff1a; <build><finalName>zsxt</finalName> <plugins> <plugin> <groupId>org.mybatis.genera…

django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块

CBV加装饰器 第一种  method_decorator(装饰器&#xff09;  加在get上 第二种  method_decorator(login_auth,nameget)  加在类上 第三种  method_decorator(login_auth)  加在dispatch上  3.7的要return super().dispatch def login(request):if request.metho…

Dubbo理论知识

本文是作者根据官方文档以及自己平时的使用情况&#xff0c;对 Dubbo 所做的一个总结。如果不懂 Dubbo 的使用的话&#xff0c;可以参考我的这篇文章《超详细&#xff0c;新手都能看懂 &#xff01;使用SpringBootDubbo 搭建一个简单的分布式服务》 Dubbo 官网&#xff1a;http…

外观模式(facade)

外观模式是为了解决类与类之间的依赖关系的&#xff0c;像spring一样&#xff0c;可以将类和类之间的关系配置到配置文件中&#xff0c;而外观模式就是将他们的关系放在一个Facade类中&#xff0c;降低了类类之间的耦合度&#xff0c;该模式中没有涉及到接口&#xff0c;看下类…

widows下nignx的使用

nignx在Linux环境下可以大展身手&#xff0c;在widows环境下也可以启动一定的效果&#xff0c;但是没有linux用的好。 Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。 什么是反向代理&#xff1f; 反向代…

享元模式(Flyweight)

享元模式的主要目的是实现对象的共享&#xff0c;即共享池&#xff0c;当系统中对象多的时候可以减少内存的开销&#xff0c;通常与工厂模式一起使用。 FlyWeightFactory负责创建和管理享元单元&#xff0c;当一个客户端请求时&#xff0c;工厂需要检查当前对象池中是否有符合条…

redo

在innodb存储引擎中&#xff0c;事务日志通过重做(redo)日志文件和InnoDB存储引擎的日志缓冲(InnoDB Log Buffer)来实现。当开始一个事务时&#xff0c;会记录该事务的一个LSN(Log Sequence Number&#xff0c;日志序列号)&#xff1b;当事务执行时&#xff0c;会往InnoDB存储引…

迭代子模式(Iterator)

顾名思义&#xff0c;迭代器模式就是顺序访问聚集中的对象&#xff0c;一般来说&#xff0c;集合中非常常见&#xff0c;如果对集合类比较熟悉的话&#xff0c;理解本模式会十分轻松。这句话包含两层意思&#xff1a;一是需要遍历的对象&#xff0c;即聚集对象&#xff0c;二是…

oracle查看执行计划入门

基于Oracle的应用系统很多的性能问题都是由应用系统的SQL性能低劣引起的&#xff0c;因此SQL的性能优化非常重要。要分析与优化SQL的性能&#xff0c;一般是通过查看该SQL的执行计划&#xff0c;然后通过执行计划有针对性地对SQL进行相应的优化。 什么是执行计划&#xff08;Ex…

这半年……

有半日也还清闲的时间&#xff0c;一年的一半也快过完了&#xff0c;那就来谈一谈这半年吧&#xff0c;也对下半年提出点期待。 年初&#xff0c;提出了本年度的的关键词&#xff1a;真实、踏实、勤快。 基于这个指导思想&#xff0c;我对自己半年的评价是&#xff1a;做得不错…

layui如何隐藏弹出层关闭的按钮

layui默认弹出层是带有关闭按钮的&#xff0c;但是在某些场景我们不需要layui的关闭按钮&#xff0c;这时只需添加closeBtn :0即可效果图如下: 示例代码如下: layui.use(layer, function () {var layer layui.layer;layer.open({skin: demo-class,type: 1,title: 登录,area: […

charles请求入参中有乱码

工作中&#xff0c;需要入参&#xff0c;但是发现入参中&#xff0c;有中文的都是乱码&#xff0c;仔细查阅headers&#xff0c;发现Content-Type是application/x-www-form-urlencoded类型&#xff0c;而实际上&#xff0c;入参是json类型&#xff0c;因此需要强制修改请求头为…

用spring搭建微信公众号开发者模式下服务器处理用户消息的加密传输构架(java)

要搭建加密传输的微信公众号消息传输&#xff0c;首先要在开发这平台下载一下微信加密的相关jar包&#xff0c;并做一些准备。准备的步骤如下&#xff1a; 1.打开开发者文档&#xff0c;找到消息加减密--->接入指引&#xff0c;如下图所示&#xff1a; 2.在页面底部找到实例…

Spring中AOP的使用

问题&#xff1a;什么是AOP&#xff1f; 答&#xff1a;AOP基本概念&#xff1a;Aspect-Oriented Programming&#xff0c;面向方面编程的简称&#xff0c;Aspect是一种新的模块化机制&#xff0c;用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)&#xff…

mybatis自己学习的一些总结

以前一直在使用spring的JDBCTEMPLATE和hibernate做项目&#xff1b;两个都还不错&#xff0c;spring的jdbctemplate用起来比较麻烦&#xff0c;虽然很简单。而hibernate呢&#xff0c;用起来很好用&#xff0c;很方便&#xff0c;但是很多规矩&#xff0c;规则还有方法到现在都…

SSL的TCP通信

一切尽在代码中&#xff0c;额&#xff0c;自己测试的小例子&#xff0c;感觉很有用&#xff0c;做个记录。 服务器端&#xff1a; </pre><pre name"code" class"java">package com.mpc.test.clazz;import java.io.BufferedReader; import ja…

java反射的使用概览

额&#xff0c;研究过这个的人很多很多&#xff0c;但是我没有很深入的研究过&#xff0c;所以谁也拦不住我去研究研究&#xff0c;然后记录下来如有雷同那就雷同了请多多包涵。 首先是整个项目的结构&#xff1a; 使用到的类&#xff1a; package reflect.demo;public class D…

moodle3.7中文语言包

Moodle官方有中文语言包&#xff0c;但是还有没有翻译的&#xff0c;为了提高用户体验&#xff0c;可以将部分未翻译的应用在Moodle网站管理中自己修改。 具体步骤&#xff1a; 先确定需要修改的关键字&#xff0c;也就是网站中没有翻译成中文的文字在centos中定位到moodle网站…

Spring项目中使用webservice实现h5的websocket通信

一、在项目中建立一个webservice来做后台操作。 package org.calonlan.soulpower.websocket;import java.text.SimpleDateFormat; import java.util.Date;import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.we…

[连载型] Neutron 系列 (15): OpenStack 是如何实现 Neutron 网络 和 Nova虚机 防火墙的...

问题导读&#xff1a;1.Nova安全组是什么&#xff1f;2.Nova的是如何配置的?3.FWaas是什么&#xff1f;1. Nova 安全组1.1 配置 节点配置文件配置项说明controller/etc/nova/nova.confsecurity_group_api nova是的 nova secgroup* 命令使用的是 nova 安全组的 API/etc/neutro…