首页 > 代码库 > 浅表复制(克隆)和深表复制(克隆)
浅表复制(克隆)和深表复制(克隆)
首先我有一个自定义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;
浅表复制(克隆)和深表复制(克隆)