码迷,mamicode.com
首页 > 其他好文 > 详细

浅表复制(克隆)和深表复制(克隆)

时间:2014-09-11 20:56:32      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:des   io   ar   数据   sp   cti   on   c   ad   

首先我有一个自定义User类有一个age属性,此时:

       ArrayList list=new ArrayList();
       User user=new User();
      user.setAge(10);
       list.add(user);  
     //克隆,浅表复制,复制的是地址
       ArrayList list2=(ArrayList) list.clone();
       user=(User) list.get(0);
       user.setAge(20);

System.out.println("list2的值"+((User) list2.get(0)).getAge());

此时list和list2的.get(0)共用user地址,不管哪一个修改了age值,集合里存储的数据最终也都会跟着改变;

如果不想共用一个user,这时就用到了深表克隆:

深表克隆集合里的自定义类必须实现序列化:public class User implements Serializable {}

此时写一个方法:

 private static ArrayList deepClone(ArrayList list) throws IOException, ClassNotFoundException {

//写入流
  ByteArrayOutputStream byteout=new ByteArrayOutputStream();
  ObjectOutputStream out=new ObjectOutputStream(byteout);
  out.writeObject(list);


//输出流到内存
  ByteArrayInputStream byteIn=new ByteArrayInputStream(byteout.toByteArray());
  ObjectInputStream in=new ObjectInputStream(byteIn);
  ArrayList dest=(ArrayList)in.readObject();
  return dest;
 }

用这个方法后,两个list内存地址就不一样了;

    ArrayList list=new ArrayList();
       User user=new User();
      user.setAge(10);
       list.add(user);

 list2=deepClone(list);

 user=(User) list2.get(0);
       System.out.println(user.getAge());
       user.setAge(30);
       System.out.println("深表复制后......................");

 System.out.println("list的值"+((User) list.get(0)).getAge());
 System.out.println("list2的值"+((User) list2.get(0)).getAge());

这样子第一个list输出10,第二个输出30;

浅表复制(克隆)和深表复制(克隆)

标签:des   io   ar   数据   sp   cti   on   c   ad   

原文地址:http://www.cnblogs.com/345214483-qq/p/3967204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!