java对象复制_Java对象的深层复制与浅层复制
TestVO a = new TestVO();
a.setName("xiemingmei");
a.setBirthPlace("Hunan");
TestVO b = new TestVO();
b.setName(a.getName());
b.setBirthPlace(a.getBirthPlace());
(2) 通过复写object.clone来实现。
class TestVO implements Cloneable {
.......
TestVO clone(){
return (TestVO)super.clone();
}
}
TestVO a = new TestVO();
a.setName("xiemingmei");
a.setBirthPlace("Hunan");
TestVO b = a.clone();
(3)通过工具类,如spring的BeanUtils, 属性个数很多时候适用。
TestVO a = new TestVO();
a.setName("xiemingmei");
a.setBirthPlace("Hunan");
TestVO b = new TestVO();
BeanUtils.copyProperties(a, b);
另外,如果Java对象的属性都是只读类的话,如原始数据类型、数据封装类、String、BigDecimal、BigInteger等,那么浅层复制与深层复制达到的效果是一样的。如果属性有Date或其他自定的数据类,则一定的小心了,因为这时浅层复制后对象B的属性F1与原始对象A的对应属性F2,都是引用到同一个对象O,如果通过B.F1的方法改了O的值,则修改会影响到A.F1,这时也就会发生互串的情况。以下例子可以说明这个情况。
TestVo tv = new TestVo();
tv.setT1("t1");
tv.setT(new Date(1000000L));
System.out.println("Tv.T:" + tv.getT());
System.out.println("Tv.T1:" + tv.getT1());
System.out.println("-------------------------------");
TestVo tv2 = (TestVo)tv.clone();
System.out.println("tv.T1==tv2.T1:" + (tv.getT1() == tv2.getT1()));
System.out.println("tv.T==tv2.T:" + (tv.getT() == tv2.getT()))
(1)tv2.getT().setTime(2000000L);
System.out.println("Tv2.T:" + tv2.getT());
System.out.println("-------------------------------");
TestVo tv3 = new TestVo();
BeanUtils.copyProperties(tv, tv3);
System.out.println("tv.T1==tv3.T1:" + (tv.getT1() == tv2.getT1()));
System.out.println("tv.T==tv3.T:" + (tv.getT() == tv2.getT()));
(2)tv3.getT().setTime(30000000L);
System.out.println("Tv3.T:" + tv3.getT());输出结果为:
Tv.T:Thu Jan 01 08:16:40CST 1970
Tv.T1:t1
-------------------------------
tv.T1==tv2.T1:true
tv.T==tv2.T:true
Tv.T::Thu Jan 01 08:33:20 CST 1970
-------------------------------
tv.T1==tv3.T1:true
tv.T==tv3.T:true
Tv.T:::Thu Jan 01 16:20:00 CST 1970
大家可以看出,(1)(2)的代码操作的是tv2、tv3,但是tv的T的值发生了改变。因为T是Date类型的,而Date是一个可变的类,这样浅层复制就出现属性值互串的情况。
分享到:
2011-06-11 15:41
浏览 13474
评论
7 楼
呆呆DE萌萌
2014-03-12
第一种情况是浅度复制?是深度复制吧~
6 楼
大江帅
2013-08-28
ltyjyufo 写道
那深层复制怎么实现阿,楼主这说的只是浅层复制阿,既然浅层复制后对象B的属性F1与原始对象A的对应属性F2,都是引用到同一个对象O,如果通过B.F1的方法改了O的值,则修改会影响到A.F1,这时也就会发生互串的情况,楼主也没有提出解决的方法阿
可用用ObjectOutputStream和ObjectInputStream来实现深层复制
5 楼
xiemingmei
2012-11-07
ltyjyufo 写道
那深层复制怎么实现阿,楼主这说的只是浅层复制阿,既然浅层复制后对象B的属性F1与原始对象A的对应属性F2,都是引用到同一个对象O,如果通过B.F1的方法改了O的值,则修改会影响到A.F1,这时也就会发生互串的情况,楼主也没有提出解决的方法阿
要分只读类的对象和可写类的对象。对于只读的,没有关系,无需建新对象;对于可写的,则需要用类似以下的代码: ClassO1 b = new ClassO1();
BeanUtils.copyProperties(a, b); 再来复制一个对象出来。
4 楼
ltyjyufo
2012-11-03
那深层复制怎么实现阿,楼主这说的只是浅层复制阿,既然浅层复制后对象B的属性F1与原始对象A的对应属性F2,都是引用到同一个对象O,如果通过B.F1的方法改了O的值,则修改会影响到A.F1,这时也就会发生互串的情况,楼主也没有提出解决的方法阿
3 楼
yljf1314
2012-08-22
那既然我们一般使用的是浅复制,那如何解决这种问题,实现深复制呢?
2 楼
xiemingmei
2011-06-15
如果A.F1的内容改变,比如调用A.F1.setX(*),则B.F1.X也会发生变化。
如果A.F1=obj,这是不会对B.F1产生影响的,应为F1的引用变了,这时,A.F1与B.F1所指向的不是同一个对象。
浅层复制··如果要是A或者B改变了的话··那两外一个对象会不会改变?
java对象复制_Java对象的深层复制与浅层复制相关推荐
- JAVA浅层复制深层复制理解-java_01_20160824
在java中,默认是浅层复制的,如果要复制的对象中只含有基本数据类型和String类型, 那么浅层复制和浅层复制是没有区别的,所以你可以放心的使用默认的浅层复制, 但是如果要复制的对象中除了上述类型还 ...
- [转载] 深层复制构造函数和浅层复制构造函数区别
参考链接: Python复制(深层复制和浅层复制) 构造函数用来初始化对象的,复制构造函数是把一个已知的对象复制给新的对象,(2者都是对象). 浅复制构造函数只复制指针(换句话说就是2个对象的地址一样 ...
- 浅层学习与深层学习_深层副本与浅层副本-以及如何在Swift中使用它们
浅层学习与深层学习 by Payal Gupta 通过Payal Gupta 深层副本与浅层副本-以及如何在Swift中使用它们 (Deep copy vs. shallow copy - and h ...
- 如何在JavaScript中区分深层副本和浅层副本
by Lukas Gisder-Dubé 卢卡斯·吉斯杜比(LukasGisder-Dubé) 如何在JavaScript中区分深层副本和浅层副本 (How to differentiate betw ...
- java浅度克隆_java对象 深度克隆(不实现Cloneable接口)和浅度克隆
为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说 ...
- java初始化实例化_Java对象的创建过程:类的初始化与实例化
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...
- java 对象复活_Java对象复活
java 对象复活 总览 收集覆盖了finalize()的对象之后,将其添加到终结处理队列中,以在调用每个对象的finalize()方法之后进行清理. 如果您复活了物体,会发生什么? 何时定案? fi ...
- java jol原理_Java对象布局(JOL)实现过程解析
java对象布局JOL(java object layout),描述对象在堆内存的布局.如下图: 1.markword 固定长度8byte,描述对象的identityhashcode,分代年龄,锁信息 ...
- java开源对象池_JAVA 对象池
GenericObjectPool利用一个org.apache.commons.collections.CursorableLinkedList对象来保存对象池里的对象.这种对象池的特色是: 可以设定 ...
最新文章
- CUDA动态库封装以及调用
- 今天整理了短距离传输技术的比较!有用得到的,请拿走不谢!
- 9.1 ps:查看进程
- vim学习日志(5):vim下wimrc的配置,解决中文乱码问题
- 统一设置网站html文件输出编码为utf-8,以解决乱码问题
- Leetcode刷题(4)罗马数字转整数
- recyclerview item动画_这可能是你见过的迄今为止最简单的RecyclerView Item加载动画...
- 06 使用VS2012开发简单控制器程序 1214
- Zend Studio 10.6正式版注册破解地址
- java手动分页工具类
- Skype For Business Server 2015 离线消息
- 深入浅出MFC 读书笔记1
- 87相似标准形08——Jordan标准形
- 酷派无线升级服务器设置在哪里,酷派手机CDA自助升级线刷工具安装教程
- win10深度清理c盘垃圾的方法【系统天地】
- 软件测试工作的基本流程是什么
- 云计算技术,主要包含哪些关键技术?
- Context上下文到底是个什么东东?
- np.arry()的用法
- Ableton Live Suite 10.1.15 WiN 音乐制作宿主软件下载
热门文章
- 好朋友的爬虫共享资料,真佩服
- 在Python数据库连接池中如何创建请求连接的方案
- 大数据分析-时间序列(pandas库 )
- webbrowser控件 加载为空白_OpenLayers教程五:地图控件之坐标拾取控件和鹰眼控件...
- 2字节取值范围_C语言整数的取值范围以及数值溢出
- python批量创建实例_Django批量创建Model实例
- easyui datalist 不显示数据_爬虫练习——豆瓣电影信息爬取及数据可视化
- nvme装系统不能自引导_新买的固态硬盘用AHCI不能装系统,而用IDE却可以?问题就在这里...
- cas云计算机管理平台添加加密锁,CAS云计算管理平台安装手册.docx
- 2019 - OO第一单元作业总结