首页 > 代码库 > 浅表复制(克隆)和深表复制(克隆)

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

首先我有一个自定义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;

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