拷贝clone() 与new的区别?

浅拷贝
实现clone()方法的时候,
如果用默认的super.clone()方法会调用Object类的默认拷贝,缺陷:不会把所有的属性全部拷贝一份,拷贝规则:
(1)基本类型,拷贝其值
(2)对象:
拷贝引用地址,新拷贝的对象和原有对象共享该实例变量,不受访问权限控制。
(3)String字符串:拷贝的是引用,但有点特殊,在修改时,会从字符串池中重新生成新的字符串。原有的字符串内容保持不变,故可以认为String是一个基本类型。
 
为了实现深拷贝:
在clone()方法的重载时,
在设置属性时new一个对象出来。这样拷贝出来的和原来的不会共有一份引用。
建议44.推荐使用序列化实现对象的深拷贝
实现Cloneable接口实际上就具备了拷贝能力,但如果一个项目中有大量的对象是通过拷贝生成的,每个类都写一个clone(0方法,并且还要深拷贝?那就非常麻烦了。
方法:
通过序列化方式来处理,在内存中通过字节流的拷贝来实现,即把母体对象写到一个字节流中,再从字节流中将其读出来。该新对象和母对象之间不存在引用共享的问题,也就相当于深拷贝了一个新对象。
public class ColoneUtils{
public static <T extens Serializable> T clone(T obj){
T cloneObj = null;
try{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.close();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
cloneObj = (T)ois.readObject();
ois.close();
}catch(Exception e){
e.printStackTrace();
}
return cloneObj;
}
}
当然,被拷贝的对象必须实现Serializeable接口,否则没办法拷贝的。
还要注意:
(1)对象的内部属性都是可序列化的
(2)方法和属性的特殊修饰符。
@transient
瞬态变量,不进行序列化的变量。
当然 Apache 的commons工具包中SerializationUtils类。没用过。

转载于:https://www.cnblogs.com/akingseu/p/3485793.html

[编写高质量代码:改善java程序的151个建议]建议43 避免对象浅拷贝; 建议44:推荐使用序列化实现对象的深拷贝...相关推荐

  1. java 151建议_编写高质量代码改善java程序的151个建议——导航开篇

    前言 系列文章: 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,惨不忍睹是吧.确实,人和代码一样都在成长,都在变好当中.有时候只是实现功能的编程,长 ...

  2. 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...

                 The reasonable man adapts himself to the world; The unreasonable one persists in trying ...

  3. 博友的 编写高质量代码 改善java程序的151个建议

    编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html 转载于:https://www.cnblogs.c ...

  4. Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议

    代码是我们前进的基石. 废话不多说直接把本书部分内容展示出来 目录 == 第1章Java开发中通用的方法和准则/1 建议1:不要在常量和变量中出现易混淆的字母/2 建议2:莫让常量蜕变成变量12 建议 ...

  5. 编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理

    编写高质量代码改善java程序的151个建议--[110-117]异常及Web项目中异常处理 原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保 ...

  6. 编写高质量代码:改善Java程序的151个建议 --[106~117]

    编写高质量代码:改善Java程序的151个建议 --[106~117] 动态代理可以使代理模式更加灵活 interface Subject {// 定义一个方法public void request( ...

  7. 转载----编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...

    阅读目录 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的类型务必一致 建议4:避免带有变长参数的方法重载 建议5:别让null值和空值威胁到变长方法    ...

  8. 编写高质量代码:改善Java程序的151个建议(第9章:多线程和并发___建议125~131)

    建议125:优先选择线程池 建议126:适时选择不同的线程池来实现 建议127:lock与synchronized是不一样的 建议128:预防线程死锁 建议129:适当设置阻塞队列的长度 建议130: ...

  9. 读-秦小波-编写高质量代码:改善java程序的151个建议

    有些建议不太用到,但是用到的时候如果不注意就会进坑,所以书名改成java的151个坑更合适. 不要在常量和变量中出现易混淆的字母 包名全小写,类名首字母全大写,常量全大写下划线分割,变量驼峰: 字母l ...

  10. 转载--编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议60~64)

    阅读目录 建议60:性能考虑,数组是首选 建议61:若有必要,使用变长数组 建议62:警惕数组的浅拷贝 建议63:在明确的场景下,为集合指定初始容量 建议64:多种最值算法,适时选择 噢,它明白了,河 ...

最新文章

  1. 美国计算机专业录取率,美国留学高录取率院校计算机专业申请条件是什么? 爱问知识人...
  2. Android 高效的`InjectView – ButterKnife`
  3. 7.定义一个有80个元素的字符数组,从键盘输入一串字符,将其中的大写字母转换为小写字母,而将原来为小写的字母转换为大写字母,其他字符不变。
  4. python变量与常量内容:
  5. [Hadoop]-YARN-伪分布式部署-hadoop-2.6.0-cdh5.7.0
  6. IronRuby 0.0.1.0
  7. 图像二维离散傅里叶变换、幅度谱、相位谱
  8. 深度学习目标检测之 YOLO v3
  9. python 多关键字匹配_使用django的objects.filter()方法匹配多个关键字的方法
  10. key php 转小写_php字符串替换以及大写字母转小写字母
  11. 6常见的HTML和CSS面试问答
  12. CSS的Padding, Margin, Border 的区别
  13. Linux 下串口编程入门教程
  14. 23. SQL -- SQL Server安装,运行架构,管理SQL
  15. 燕姿几首歌的歌词-偶得
  16. 鲲鹏920的服务器芯片,鲲鹏920芯片是什么芯片
  17. php漏洞eval,Web安全之代码执行漏洞
  18. ppt矩形里面的图片怎么放大缩小_ppt 怎么让图片放大完成以后再缩小到原来的大小和位子!!!!...
  19. 录制PPT课件哪个录屏软件好?这3款值得收藏
  20. 第六章 网络学习相关技巧1(最优路径梯度)

热门文章

  1. android侧边栏点击,侧边菜单栏 android-menudrawer
  2. Python PEP8 编码规范 代码布局
  3. c#结构体与类的区别
  4. python第三篇:python、flask关系映射
  5. 我这么玩Web Api(一):帮助页面或用户手册(Microsoft and Swashbuckle Help Page)
  6. 外部类与嵌套类的区别
  7. onmouseover|onmouseout和onmouseenter|onmouseleave的区别
  8. 【笔记】定积分的近似计算
  9. docker-compose学习
  10. 为什么分布式数据库中不使用uuid作为主键?