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,从而将之排除在复制过程之外。

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

  1. java 字符串总结_Java中字符串(String)总结

    先说说JDK API: JDK中包含大量的API类库,所谓API(Application Programming Interface,应用程序编程接口,这些功能以类的形式封装). JDK API包含的 ...

  2. java对象深克隆_JAVA中对象的克隆及深拷贝和浅拷贝

    使用场景: 在日常的编程过程 中,经常会遇到,有一个对象OA,在某一时间点OA中已经包含了一些有效值 ,此时可能会需一个和OA完全相对的新对象OB,并且要在后面的操作中对OB的任何改动都不会影响到OA ...

  3. java 字符串用法_java中字符串的用法

    1.String中的每个字符都是一个16位的Unicode字符,用Unicode很容易表达丰富的国际化字符集,比如很好的中文支持.甚至Java的标识符都可以用汉字,但是没人会用吧(只在一本清华的< ...

  4. java 字符串掐头去尾_java中常见的类

    简介 类层次结构最顶层的基类,所有类都直接或间接继承自Object类,所以,所有的类都是以恶个Object(对象) 构造方法 Object: 构造一个对象,所有子类初始化时都会优先调用该方法 常用的成 ...

  5. java 字符串 判断_Java中判断字符串是否相等的实现

    在最近的开发中,我踩到一个坑,过程是这样的.我需要在Java中判断两个字符串是否相等,按照以往的经历使用 == 双等号的操作符来判断,但是在Java中,这样写却没有实现我想要的效果.经过查阅资料后,把 ...

  6. java 初始化顺序_Java中对象初始化顺序的详细介绍

    前言 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com ...

  7. java 字符串 面试_JAVA中String介绍及常见面试题小结

    字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 深刻认识String 1)String为字符串常量:即String对象一旦 ...

  8. java 字符串驻留_Java中的字符串驻留

    最近在工作的时候,一句再正常不过的代码String a = "hello" + "world";被改成了new StringBuilder().append(& ...

  9. java 字符串用法_Java中的字符串用法小结

    本文实例总结了Java中的字符串用法.分享给大家供大家参考.具体分析如下: 字符串的本质是char类型的数组,但在java中,所有用双引号""声明的字符串都是一个String类的对 ...

最新文章

  1. 下载MySQL并创建桌面数据库_sql桌面数据库
  2. Vue CLI 3开发中屏蔽烦人的EsLint错误
  3. 【福利赠书】命题专家点评中国研究生数学建模之现状
  4. java编程启蒙_程序设计入门—Java语言
  5. c++学习笔记(15) 异常处理
  6. form表单自动回车提交
  7. c语言实现sbrk函数,菜鸟随笔(2)---brk()与sbrk()函数的学习与使用
  8. XPS文件转换成PDF
  9. COPRA RF 2005 SR1
  10. 月活8.89亿背后:微信工程师细数兼容测试经验
  11. 电路实验---全桥整流电路
  12. ContentProvider跨进程注册、启动流程源码解析
  13. 用java把word转pdf
  14. Mex-hdu4747(DP)
  15. Scrapy翻页爬取示例——列表页、详情页
  16. ad怎么导入cad的外形尺寸_AD10怎样精确导入CAD文件?
  17. matlab画柱形图
  18. BurpSuite超详细安装教程-功能概述-配置-使用教程---(附下载链接)
  19. 微信小程序将unicode格式内容转为中文
  20. 511遇见易语言磁盘操作取磁盘空间和驱动器列表

热门文章

  1. Berkeley DB作用
  2. java如何生成验证码
  3. html之字符数字引用
  4. 代理网关设计与实现(基于NETTY)
  5. 如何通过任务调度实现百万规则报警
  6. 从零入门Serverless|一文搞懂函数计算及其工作原理
  7. 阿里99大促 | 模型识别背后的样本生成
  8. 如何低成本实现Flutter富文本,看这一篇就够了!
  9. 手把手教你D2C,走向前端智能化
  10. IDE 插件新版本发布,开发效率 “biu” 起来了