这次做项目。遇到了问题。发了帖子在这里:http://topic.csdn.net/u/20110216/10/e7787e85-454b-4a84-b4be-b6d712926e28.html.
原来ArrayList是浅拷贝。
大家应该理解浅拷贝和深拷贝的区别:
浅拷贝:被复制对象的任何变量都含有和原来的对象相同的值,而任何的对其他对象的引用仍然指向原来的对象。对拷贝后的引用的修改,还能影响原来的对象。
深拷贝:把要复制的对象所引用的对象都复制了一遍,对现在对象的修改不会影响原有的对象。
如果大家还不理解,在网上看到一个人的比喻很有意思:
就好比一个爸爸一个儿子 浅拷贝:你克隆一下,只得到一个爸爸,这是浅 深拷贝:你克隆一下,既得到了爸爸,又得到了儿子,这是深 另外,如果你克隆的对象里面还包括其他对象,比如汽车对象里还有座位对象,那么浅的结果就是汽车被拷贝了,座位并没有,深的话,就是一起都拷贝了。
下面,给大家说一下如何实现ArrayList的深拷贝的一种实现方式:
有一个类Userinfo,需要实现Serializable接口,可以序列化。
Java代码 package test; import java.io.Serializable; public class Userinfo implements Serializable { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
下面是我的一个测试类:
Java代码 package test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; public class TestMain { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub List src = new ArrayList(2); Userinfo ui1 = new Userinfo(); ui1.setId(1); ui1.setName("aaa"); src.add(ui1); Userinfo ui2 = new Userinfo(); ui1.setId(2); ui1.setName("bbb"); src.add(ui2); List dest = new ArrayList(2); TestMain test = new TestMain(); try { dest = test.deepCopy(src); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(src==dest); Userinfo u = (Userinfo)src.get(0); Userinfo uu = (Userinfo)dest.get(0); uu.setName("dkkdkddk"); System.out.println(u.getName()); System.out.println(uu.getName()); } public List deepCopy(List src) throws IOException, ClassNotFoundException{ ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(src); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in =new ObjectInputStream(byteIn); List dest = (List)in.readObject(); return dest; } }
就是把ArrayList的原来的对象进行序列化,然后通过反序列化读取出来,就可以了。
当然,记着放到集合中的元素也要能够序列化,所以必须实现Serializable接口。
在此,也欢迎大家提出其它的ArrayList深拷贝实现方法。
另:http://hi.baidu.com/%D5%C5%B9%DA%C1%D6/blog/item/1c1acd17d36e3c0bc93d6d8b.html
