java List深层拷贝和浅层拷贝
1.基础理解
对于基本数据类型,实际上是拷贝它的值,而对于引用数据类型,拷贝的就是它的引用,并没有创建一个新的对象,即没有分配新的内存空间。这样的拷贝就称作浅拷贝。
深拷贝就是在引用类型进行拷贝时,创建了新的对象,即分配了新的内存空间给拷贝对象。
2.示例
关于深层拷贝和浅层拷贝,建议简单理解为
2.1浅层拷贝:ListA 有多条数据,ListB 拷贝ListA所有数据,当ListA中原有数据被修改时候,ListB中对于的数据也会被修改。
List<User> user=userMapper.getUserByPhone(phone);//原始数据 此时手机号是1522222222
List<User> userNew=user;//拷贝数据此时手机号是1522222222
userNew.get(0).setPhone("153333333");//此处设置之后user.get(0).getPhone();userNew.get(0).getPhone() 手机号都是153333333
2.2 其他浅层拷贝
//1 遍历循环复制 List<User> userList = new ArrayList<User>(oldUsewrList.size()); for(User user : oldUsewrList){ userList.add(p); } //2使用List实现类的构造方法 List<User> userList = new ArrayList<User>(oldUsewrList); //3使用list.addAll()方法 List<User> userList = new ArrayList<User>(); userList.addAll(oldUsewrList); //4使用System.arraycopy()方法 User[] userList=oldUsewrList.toArray(new User[0]); User[] newList=new User[userList.length]; System.arraycopy(userList, 0, newList, 0, userList.length); //5使用Stream的方式copy List<User> newList = userList.stream().collect(Collectors.toList());
深层拷贝: ListA 有多条数据,ListB 拷贝ListA所有数据,当ListA中原有数据被修改时候,ListB中对于的数据也会被修改。
//1序列化深层拷贝
public static <T> List<T> deepCopy(List<T> 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); @SuppressWarnings("unchecked") List<T> dest = (List<T>) in.readObject(); return dest; }
//2调用deepCopy
List<User> user=userMapper.getUserByPhone(phone);//原始数据 此时手机号是1522222222
List<User> userNew=deepCopy(user);//拷贝数据此时手机号是1522222222
userNew.get(0).setPhone("153333333");//此处设置之后user.get(0).getPhone()手机号都是1522222222;userNew.get(0).getPhone() 手机号是153333333
//3注意 使用序列化的方式深层拷贝,User.class 先需要 implements Serializable
public class User implements Serializable{}