我一直很困惑Java容器的拷貝構造函數是淺拷貝還是深拷貝? 以下是我的理解: ints1,ints2,ints3是引用,因此它們位於堆棧中。 inst1指向堆中的某個對象,並且此對象包含三個位於堆棧中的匿名引用,並且它們指向分別具有int值0,1,2的對象。Java ArrayList的拷貝構造函數是淺拷貝還是深拷貝?
ints2 = ints1
so ints2指向與ints1相同的對象。因此,改變ints2中的反對者所指向的對象將會影響ints2中的那些對象。
ints2.set(1,0+10)
將改變retsnence ints1.get(0)的對象。
ints3 = new ArrayList<>(ints1)
接下來是我的困惑。
如果複製構造函數是淺拷貝,那麼雖然ints1和ints3指向不同的對象,但兩個對象具有相同的引用!因此,通過在ints1中操作引用來更改對象的任何操作都會更改ints3,因爲它們指向的是相同的對象。
如果複製構造函數是深度複製,則ints1和ints3將包含不同的引用並指向不同的對象。然後ints1的變化不會影響ints3。
根據結果,似乎複製構造函數是深拷貝,而不是淺拷貝。
希望有人能糾正我,謝謝。
import java.util.*;
public class MyClass {
public static void main(String args[]) {
List<Integer> ints1 = new ArrayList<>(Arrays.asList(0,1,2));
System.out.println(ints1);
List<Integer> ints2 = ints1;
ints2.set(0,0+10);
System.out.println(ints1);
List<Integer> ints3 = new ArrayList<>(ints1);
ints3.set(1,1+10);
System.out.println(ints1);
}
}
result
[0, 1, 2]
[10, 1, 2]
[10, 1, 2]
不要混淆整數的不變性與淺與深的副本。請閱讀以下內容:https://yunmingzhang.wordpress.com/2014/01/08/making-shallow-copies-for-java-arraylist-collections-objects/ – Jason
ints1和ints2引用的是相同的對象,而ints3是使用ints1中的值創建的單獨對象。因此,ints2中的任何更改都會更改ints1。但ints3的變化不會影響其他兩個對象..如果你有困惑嘗試打印所有對象的哈希碼,你可以看到不同之處.. –