在Java中,對(duì)象的拷貝通常分為兩種類型:淺拷貝和深拷貝。淺拷貝只是拷貝了對(duì)象的引用,而深拷貝則是完全復(fù)制一個(gè)新的對(duì)象。
一、什么是淺拷貝?
淺拷貝是指在拷貝一個(gè)對(duì)象時(shí),只拷貝它的值,而不拷貝它所引用的對(duì)象。也就是說(shuō),淺拷貝只是拷貝了對(duì)象的引用,而不是它引用的對(duì)象本身。這意味著,如果您更改源對(duì)象,它還會(huì)影響副本對(duì)象。
下面是一個(gè)使用淺拷貝的示例,可以看到修改原始對(duì)象后,副本對(duì)象也會(huì)被修改。
public class ShallowCopyDemo {
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
ArrayList<String> list2 = list1;
System.out.println("list1:" + list1); // [a, b, c]
System.out.println("list2:" + list2); // [a, b, c]
list1.add("d");
System.out.println("list1:" + list1); // [a, b, c, d]
System.out.println("list2:" + list2); // [a, b, c, d]
}
}
二、什么是深拷貝?
深拷貝是指在拷貝一個(gè)對(duì)象時(shí),不僅拷貝它的值,還要遞歸地拷貝它所引用的對(duì)象,這樣就完全復(fù)制了一個(gè)新的對(duì)象。這意味著,如果您更改源對(duì)象,它不會(huì)影響副本對(duì)象。
下面是一個(gè)使用深拷貝的示例,可以看到修改原始對(duì)象后,副本對(duì)象不會(huì)被修改。
public class DeepCopyDemo {
public static void main(String[] args) throws CloneNotSupportedException {
ArrayList<String> list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
ArrayList<String> list2 = (ArrayList<String>) list1.clone();
System.out.println("list1:" + list1); // [a, b, c]
System.out.println("list2:" + list2); // [a, b, c]
list1.add("d");
System.out.println("list1:" + list1); // [a, b, c, d]
System.out.println("list2:" + list2); // [a, b, c]
}
}
從上面的例子可以看出,深拷貝創(chuàng)建了一個(gè)完全獨(dú)立的對(duì)象,不會(huì)受到原始對(duì)象的影響。