java字符串深克隆_Java中对象的深复制(深克隆)和浅复制(浅克隆)之序列化...

1.浅复制与深复制概念

⑴浅复制(浅克隆)

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

举例说明:

常见的List的克隆方式有很多,下面我们来列举几种常见的List浅复制的方式:

public static void main(String []args){

List> list1 = new ArrayList>(); Map map = new HashMap();

map.put("name", "xiaoming");

map.put("age", "28");

list1.add(map); //克隆方法1:利用原list1作为参数直接构造方法生成。 List> list2 = new ArrayList>(list1); //克隆方法2:手动遍历将原list1中的元素全部添加到复制表中。 for(int i = 0, l = list1.size(); i < l; i++)

list2.add(list1.get(i)); //克隆方法3:调用Collections的静态工具方法 Collections.copy //克隆方法4:使用System.arraycopy方法进行复制 }

List自身是一个对象,他在存储类类型的时候,只负责存储地址。而存储基本类型的时候,存储的就是实实在在的值。纵然你有千千万万个List,元素还是那么几个。无论是重新构造,Collections的复制方法,System的复制方法,还是手动去遍历,结果都一样,这些方法都只改变了ArrayList对象的本身,简单的添加了几个指向老元素的地址。而没做深层次的复制。(及压根没有没有 new新对象 的操作出现。)

有的时候我们确实需要将这些元素也都复制下来而不是只是用原来内存中的元素。List层实现这个问题。java语言设计之初就考虑进去了,避免操作这些埋在堆内存中的数据,所有操作都去针对能找到他们的地址。地址没了自身还会被GC干掉。所以只好一点点的去遍历,new创建新的对象并赋予原来的值。据说可能觉得上述的做法略微调整,所以巧用序列化对象让这些数据在IO流中跑了一圈,可以实现复制。其实把对象序列化到流中,java语言实在是妥协了,毕竟你不能再把地址扔进去吧?再说了io流是要和别的系统交互的,你发给别人一个地址让别人去哪个堆里找?所以不用多提肯定要新开辟堆内存的。

⑵深复制(深克隆)之序列化

被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

Java中利用串行化来做深复制(深克隆)(避免重写比较复杂对象的深复制的clone()方法,也可以程序实现断点续传等等功能)

把对象写到流里的过程是串行化(Serilization)过程,但是在Java里又非常形象地称为“冷冻”或者“腌咸菜(picking)”过程;而把对象从流中读出来的并行化(Deserialization)过程则叫做

“解冻”或者“回鲜(depicking)”过程。

应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面,因此“腌成咸菜”的只是对象的一个拷贝,Java咸菜还可以回鲜。

在Java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里(腌成咸菜),再从流里读出来(把咸菜回鲜),便可以重建对象。

如下为深复制源代码。

public List> deClone(Object obj) throws IOException,OptionalDataException,ClassNotFoundException{

//将对象写到流里

ByteArrayOutoutStream bo=new ByteArrayOutputStream();

ObjectOutputStream oo=new ObjectOutputStream(bo);

oo.writeObject(obj);//从流里读出来

ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());

ObjectInputStream oi=new ObjectInputStream(bi);

return(oi.readObject());

}

这样做的前提是对象以及对象内部所有引用到的对象都是可串行化的,否则,就需要仔细考察那些不可串行化的对象或属性可否设成transient,从而将之排除在复制过程之外。

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

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

相关文章

Mybatis代码生成适配Oracle和Mysql数据库_01

文章目录1. 依赖2. generatorConfig.xml开源项目地址&#xff1a; https://gitee.com/gb_90/Oracle_Mysql_GenerateGit克隆方式&#xff1a; git clone gitgitee.com:gb_90/Oracle_Mysql_Generate.git1. 依赖 <?xml version"1.0" encoding"UTF-8"?&g…

离职阿里三年后,他又回来了

11月22日&#xff0c;马辉从黄龙体育中心附近的办公室开车来到阿里园区北2门&#xff0c;离开阿里三年后&#xff0c;马辉和1000多名已经毕业的“校友”又回到了这个梦想启程的地方。 在校友会现场&#xff0c;马辉分享了自己的公益故事。 1991年&#xff0c;大眼睛女孩苏明娟…

腾讯花85亿买岛;微信发原图或泄露位置信息?高通逼因特尔把Modem芯片业务卖给苹果?小米9官网正式下架……...

关注并标星星CSDN云计算 速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周两次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go goFujifilm为X-T3增添机械云台功摄模块&#xff08;…

云栖专辑 | 阿里开发者们的第4个感悟:自驱是最好的进步方式

2015年12月20日&#xff0c;云栖社区上线。2018年12月20日&#xff0c;云栖社区3岁。 阿里巴巴常说“晴天修屋顶”。 在我们看来&#xff0c;寒冬中&#xff0c;最值得投资的是学习&#xff0c;是增厚的知识储备。 所以社区特别制作了这个专辑——分享给开发者们20个弥足珍贵的…

java中塑形_Java学习5——接口和多态

1 接口接口相当于一个完全抽象的&#xff0c;没有任何实现的类所有的成员函数都是抽象函数所有的成员变量都是public static final而且一定要赋予初值接口中的静态函数必须有函数体接口在声明时也可以声明是泛型接口&#xff0c;其格式是在接口名称后加上使用关键词interface声…

SecureCRT 8.5.4.1943 CRT中文版

链接&#xff1a; https://www.newasp.net/soft/16364.html 下载网址&#xff1a; http://down-ww3.newasp.net/pcdown/soft/dys/securecrt.pj.rar

【建议珍藏系列】如果你这样回答「什么是线程安全」,面试官都会对你刮目相看!...

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 陈树义责编 | 阿秃不是线程的安全面试官问&#xff1a;“什么是线程安全”&#xff0c;如果你不能很好的回答&#xff0c;那就请往下看吧。论语中有句话叫“学而优则仕”&#xff0c;相信很多人都觉得是“学习好了可以做官”…

阿里开发者们的第5个感悟:听话,出活

2015年12月20日&#xff0c;云栖社区上线。2018年12月20日&#xff0c;云栖社区3岁。 阿里巴巴常说“晴天修屋顶”。 在我们看来&#xff0c;寒冬中&#xff0c;最值得投资的是学习&#xff0c;是增厚的知识储备。 所以社区特别制作了这个专辑——分享给开发者们20个弥足珍贵的…

bash: vue: command not found

安装Vuecli正常 npm install -g vue/cli查看vue版本&#xff0c;抛出bash: vue: command not found vue --version解决方案1&#xff1a; 在这个目录下面执行命令正常&#xff0c; 那就配置环境变量即可

机器学习与数据科学决策树指南

还在为如何抉择而感到纠结吗&#xff1f;快采用决策树&#xff08;Decision Tree&#xff09;算法帮你做出决定吧。决策树是一类非常强大的机器学习模型&#xff0c;具有高度可解释的同时&#xff0c;在许多任务中也有很高的精度。决策树在机器学习模型领域的特殊之处在于其信息…

java迷您_Java

你好&#xff0c;我也是JAVA初学者~加我一下&#xff0c;谢谢QQ&#xff1a;846491----------------解决方案--------------------------------------------------------快加我啊&#xff01;&#xff01;&#xff01;&#xff15;&#xff13;&#xff18;&#xff10;&#x…

腾讯安全全面出击:双十一不该成为黑产的狂欢

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;根据CNCERT/CC国家互联网应急中心资料报告显示&#xff1a;中国遭受DDoS攻击仅次于美国排名第二&#xff0c;在遭受攻击的行业中&#xff0c;电子商务…

Linux环境 Oracle 监听和服务 日常操作

文章目录一、Oracle监听1.1. 查看Oracle监听运行状态1.2. 启动Oracle监听1.3. 关闭监听器二、Oracle 服务2.1. 以SYS用户身份登录Oracle2.2. 切换用户至sys2.3. 启动Oracle实例2.4. 停止Oeacle实例运行一、Oracle监听 操作声明&#xff1a;登录服务器&#xff0c;切换到oracle…

五分钟教你如何用函数计算部署钉钉群发机器人

如果你是钉钉多个群的管理员&#xff0c;想要在多个钉钉群群发消息的时候&#xff0c;是不是还在为要寻找所有的群&#xff0c;并不断的复制黏贴消息而烦恼&#xff1f; 过去的你&#xff1a;(N 个群&#xff0c;N 次操作) 现在的你&#xff1a;(N 个群&#xff0c;1 次操作) …

php原生态三级联动_ajax php实现三级联动的方法

ajax php实现三级联动的方法发布时间&#xff1a;2020-08-19 09:34:43来源&#xff1a;亿速云阅读&#xff1a;106作者&#xff1a;小新小编给大家分享一下ajax php实现三级联动的方法&#xff0c;希望大家阅读完这篇文章后大所收获&#xff0c;下面让我们一起去探讨吧&#xf…

使用Terraform创建托管版Kubernetes

目前&#xff0c;阿里云容器服务已经可以创建托管版 Kubernetes 集群了。相比于默认的 Kubernetes 集群&#xff0c;托管版本会主动替您运维一套高可用的 Master 组件&#xff0c;免去了默认版本集群中三个 Master ECS 节点&#xff0c;从而节约所需的资金成本及维护时的人力成…

确认! Python夺冠,Java“被迫”退出竞争舞台,网友:崩溃!

2019年转眼已经接近尾声&#xff0c;如果盘点下2019年最火的语言&#xff0c;除了Python还能有谁&#xff1f;你心中的王者语言又是谁&#xff1f;这一年Python风光无限这一年JAVA走向右边这一年&#xff0c;我们都很感慨&#xff0c;你呢&#xff1f;关于Python&#xff0c;编…

阿里专家梁笑:2018双十一下单成功率99.9%!供应链服务平台如何迎接大促

本篇文章来自于2018年12月22日举办的《阿里云栖开发者沙龙—Java技术专场》&#xff0c;梁笑专家是该专场第一位演讲的嘉宾&#xff0c;本篇文章是根据梁笑专家在《阿里云栖开发者沙龙—Java技术专场》的演讲视频以及PPT整理而成。 摘要&#xff1a;2018年双十一平稳度过&#…

php inputcsv,php excel格式(csv)数据导入导出(示例)

需要把大量数据导入数据库中&#xff0c;比如考试成绩、电话簿等一般都是存放在excel中的数据&#xff0c;可以考虑把excel导出成csv文件。然后&#xff0c;通过以下程序即可批量导入数据到数据库中&#xff0c;上传csv并导入到数据库中&#xff0c;测试成功。代码&#xff1a;…