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{}
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章