今天看list和ArrayList的区别,发现了一个问题,
着实让我为我之前的代码出了一把汗,
之前做项目的时候用到了java的克隆,只是实现了Cloneable接口,
然后进行对象克隆并且复制、保存到数据库中,
为什么出汗,因为今天看到ArrayList的clone方法竟然是浅复制,
ArrayList list1 = new ArrayList();
list1.add(new Object());
ArrayList list2 = (ArrayList) list1.clone();
System.out.println(list1.get(0));
System.out.println(list2.get(0));
输出结果:
java.lang.Object@de6ced
java.lang.Object@de6ced
我勒个去,这两个list中的对象进入是同一个地址的,也就是说,相当于列表中的元素使用同一个对象:
Object obj = new Object();
ArrayList list1 = new ArrayList();
list1.add(obj);
ArrayList list2 = new ArrayList();
list2.add(obj);
System.out.println(list1.get(0));
System.out.println(list2.get(0));
这样做有一个很大的问题,就是说如果obj对象不是一个Object对象,而是一个自定义的对象,那么obj的一个属性的修改就会影响到list1 和list2里面的两个值。
因为我之前写的代码就是先创建一个自定义类对象,
然后for循环,对这个对象克隆,然后赋予不同的值,
最后保存到数据库中,
你说你吓人么 。
还好看到了光明:
备注:GenericCollection实现了Cloneable接口
GenericCollection gc = new GenericCollection();
GenericCollection gc2 = (GenericCollection)gc.clone();
System.out.println(gc);
System.out.println(gc2);
数据出结果:
com.hung.test.GenericCollection@18dfef8
com.hung.test.GenericCollection@15e83f9
悬着的石头总算落地了,
呵呵 这两个对象的地址不一样,
说明之前写的程序不会有影响。
也说明了一个问题:
深复制:其实实现Cloneable接口的对象,调用clone方法的时候,并不是浅复制,而是创建了新的对象,并把每个属性值都重新赋给新对象的对应属性,
浅复制:其实只是把对象的应用地址给你复制了一分而已。
至此
给大家分享一下
欢迎拍砖
-- 2012-10-25 11:48
添加说明 :
说明1:
其实,在Colneable接口的官方文档说明中,是建议覆盖object对象中的clone方法的,同时也建议调用super.clone()方法
但是我认为这样就多次一举了,如果要覆盖Object的clone方法,为什么还要调用super.clone()方法呢,自己定义就好了,可能是从性能方面考虑的吧,
但是这样也给用户提供了一个很好的机会,可以自定义clone方法,这样的话你就可以完全按照自己的意思来定制,
可以仅仅创建一个新对象返回,也可以创建对象之后给对象特定的字段赋值,这样就能打到定制化的效果。
非常好。
说明2:
完全可以只实现结构,而不覆盖Object中的clone方法,我亲自使过,可以的,因为Cloneable结构中没有定义任何方法。
分享到:
相关推荐
java对象复制.pdf
深度复制Java对象实例,复制后对象属性值改变不影响被复制对象,有注释
编程语言java对象复制.pdf
java对象复制[参考].pdf
java基础规范以及java对象的复制使用
Java对象的复制与克隆,包含浅复制和深层复制。 免费下载啦,绝对值得一看。
本篇文章是对java对象复制进行了详细的分析介绍,需要的朋友参考下
model VO 值复制 注解 注解实现相同对象,不同对象,集合与集合复制,不再需要手动。 可以对多个对象进行复制,可以指定复制的类型
主要介绍了Java对象的复制三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java中利用反射复制一个持久化对象
对象的克隆操作过程,展示了对象中数据字段是如何是实现克隆的
Java CopyUtil工具类,可以进行对象的深copy,比如:对象里面包含对象,对象里面包含Map,List,Set...等复杂类型的属性都可以copy,copy后的对象与原有对象没有联系,即改变原有对象内容,不会改变copy后的对象里面的...
model VO 值复制 注解 注解实现相同对象,不同对象,集合与集合复制,不再需要手动。 可以对多个对象进行复制,可以指定复制的类型
一个详细讲解JAVA_对象克隆的例子 希望可以帮助到你。
NULL 博文链接:https://ollevere.iteye.com/blog/1323205
Java中对象的深复制和浅复制详解.doc
android 浅复制和深复制-Java Generic Deep Copy 篇
实现了两个对象之间属性值的拷贝,只要具有相同的属性名就可以拷贝,还有两个file对象的拷贝,实现文件的复制功能
深度复制,赋值后给新对象赋值不会影响原始对象。
主要介绍了 Java对象深复制与浅复制实例详解的相关资料,需要的朋友可以参考下