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