在Java中,對象的拷貝通常分為兩種類型:淺拷貝和深拷貝嘴纺。淺拷貝只是拷貝了對象的引用败晴,而深拷貝則是完全復制一個新的對象浓冒。
一栽渴、什么是淺拷貝?
淺拷貝是指在拷貝一個對象時稳懒,只拷貝它的值闲擦,而不拷貝它所引用的對象。也就是說场梆,淺拷貝只是拷貝了對象的引用墅冷,而不是它引用的對象本身。這意味著或油,如果您更改源對象寞忿,它還會影響副本對象。
下面是一個使用淺拷貝的示例顶岸,可以看到修改原始對象后腔彰,副本對象也會被修改。
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]
}
}
二辖佣、什么是深拷貝霹抛?
深拷貝是指在拷貝一個對象時,不僅拷貝它的值卷谈,還要遞歸地拷貝它所引用的對象杯拐,這樣就完全復制了一個新的對象。這意味著世蔗,如果您更改源對象端逼,它不會影響副本對象。
下面是一個使用深拷貝的示例污淋,可以看到修改原始對象后裳食,副本對象不會被修改。
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)建了一個完全獨立的對象诲祸,不會受到原始對象的影響浊吏。