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

 

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