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

java深拷貝和淺拷貝的區別

劉若蘭1年前8瀏覽0評論

在Java中,對象的復制操作分為兩種:深拷貝和淺拷貝。深拷貝指的是復制一個對象及其所有的屬性和嵌套對象,而淺拷貝只是復制一個對象和其基本屬性,而不復制包含的嵌套對象。

//示例代碼
public class Person implements Cloneable{
private String name;
private Address address;
//構造方法、Getter、Setter省略
//淺拷貝
public Object shallowClone() throws CloneNotSupportedException{
return super.clone();
}
//深拷貝
public Object deepClone() throws IOException, ClassNotFoundException{
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(this);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return oi.readObject();
}
}

上面是一個示例代碼,有一個Person類和一個Address類。Person類中包含了一個Address屬性,用于表示這個人的住址。下面我們看看深拷貝和淺拷貝的區別。

淺拷貝

Person p1 = new Person("張三", new Address("中國", "北京"));
Person p2 = (Person) p1.shallowClone();
System.out.println(p1 == p2); //false
System.out.println(p1.getAddress() == p2.getAddress()); //true

上面的淺拷貝只復制了p1和p2的基本屬性,而沒有復制Address屬性,所以p1和p2的Address屬性引用的是同一個對象。

深拷貝

Person p1 = new Person("張三", new Address("中國", "北京"));
Person p2 = (Person) p1.deepClone();
System.out.println(p1 == p2); //false
System.out.println(p1.getAddress() == p2.getAddress()); //false

上面的深拷貝復制了p1和p2的所有屬性,包括Address屬性,所以p1和p2的Address屬性引用的是不同的對象。

綜上所述,淺拷貝只復制基本屬性,而深拷貝會復制整個對象,包括包含的對象。