色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

java對象淺拷貝和深拷貝

陳思宇1年前9瀏覽0評論

Java中的對象拷貝可以分為淺拷貝和深拷貝兩種類型。兩種拷貝方式的實現原理以及使用場景各不相同。

淺拷貝

淺拷貝是指在內存中創建一個新的對象,對于基本類型的數據直接進行值的復制,對于引用類型,僅僅是對對象地址的拷貝,新對象和原對象使用的是同一塊內存區域。淺拷貝的效率高,但是當原對象中的引用對象發生變化時,會對拷貝對象造成影響,因為拷貝對象和原對象變量對應的引用指向同一個內存地址。

public class ShallowCopy implements Cloneable{
public int[] arr;
public ShallowCopy() {
arr = new int[10];
for (int i = 0; i< arr.length; i++) {
arr[i] = i;
}
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
//調用clone方法
ShallowCopy obj1 = new ShallowCopy();
ShallowCopy obj2 = (ShallowCopy) obj1.clone();
//修改obj1引用的數組元素arr[0]的值
obj1.arr[0] = 100;
//輸出數組元素arr[0]的值
System.out.println(obj1.arr[0]);
System.out.println(obj2.arr[0]);
//obj2.arr[0]的值也被改變了

深拷貝

深拷貝是指在內存中對于所有的對象,都進行拷貝,包括所有的引用對象。對于引用對象,會新建一個對象,并且復制其對應的所有對象。深拷貝會消耗更多的時間和空間,但是拷貝后的對象與原對象互不影響,修改拷貝對象不會對原對象產生任何影響。

public class DeepCopy implements Serializable{
public int[] arr;
public DeepCopy() {
arr = new int[10];
for (int i = 0; i< arr.length; i++) {
arr[i] = i;
}
}
public Object deepClone() throws IOException, ClassNotFoundException {
//將對象寫入流中
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
//從流中讀出對象
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
//調用deepClone方法
DeepCopy obj1 = new DeepCopy();
DeepCopy obj2 = (DeepCopy) obj1.deepClone();
//修改obj1引用的數組元素arr[0]的值
obj1.arr[0] = 100;
//輸出數組元素arr[0]的值
System.out.println(obj1.arr[0]);
System.out.println(obj2.arr[0]);
//obj2.arr[0]的值沒有改變

綜上所述,淺拷貝適用于對于簡單的數據類型進行拷貝,對于復雜的數據類型可以采用深拷貝。需要注意的是,深拷貝需要對對象中的所有引用對象進行處理才能保證拷貝后的對象完全獨立于原對象。