淺拷貝和深拷貝的差異:淺拷貝:建立一個引用相同資料的對象,更改副本也會影響原始物件。深拷貝:建立一個包含原始對象資料副本的對象,更改副本不會影響原始對象。

Java 中的淺拷貝與深拷貝
引言
在Java中,理解淺拷貝和深拷貝的概念對於物件操作至關重要。本教程將詳細介紹這兩者的差異並透過程式碼範例進行說明。
淺拷貝
程式碼範例:
class Person {
private String name;
private Address address;
}
public class ShallowCopyDemo {
public static void main(String[] args) {
Person p1 = new Person();
p1.setName("John Doe");
Address addr = new Address();
addr.setStreet("123 Main St.");
p1.setAddress(addr);
// Shallow copy
Person p2 = p1;
// 更改 p2 的地址
p2.getAddress().setStreet("456 Elm St.");
// p1 的地址也发生了变化
System.out.println(p1.getAddress().getStreet()); // 输出:456 Elm St.
}
}在這個範例中,p2 是p1 的淺拷貝,它們引用相同的Address 物件。因此,對 p2 的位址進行更改也會影響 p1。
深拷貝
程式碼範例:
使用 clone() 方法或第三方函式庫(如 Apache Commons Lang)來實現深拷貝。
使用clone() 方法:
class Person implements Cloneable {
private String name;
private Address address;
@Override
public Person clone() {
try {
// 使用 super.clone() 创建新对象
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
public class DeepCopyDemo {
public static void main(String[] args) {
Person p1 = new Person();
p1.setName("John Doe");
Address addr = new Address();
addr.setStreet("123 Main St.");
p1.setAddress(addr);
// Deep copy
Person p2 = p1.clone();
// 更改 p2 的地址
p2.getAddress().setStreet("456 Elm St.");
// p1 的地址保持不变
System.out.println(p1.getAddress().getStreet()); // 输出:123 Main St.
}
}在此範例中,clone() 方法為p1 建立了一個深拷貝。更改 p2 的位址不會影響 p1,因為它們引用不同的 Address 物件。
何時使用深拷貝或淺拷貝?
例如,在快取物件或將它們傳遞給不受信任的程式碼時,務必使用深拷貝。
以上是Java中的淺拷貝和深拷貝有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!