Java ArrayList的拷贝构造函数是浅拷贝还是深拷贝?

我一直很困惑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]

回答:

答案是:浅拷贝。看看这个帖子,它给出了更多关于这个主题的细节:http://javarevisited.blogspot.co.uk/2014/03/how-to-clone-collection-in-java-deep-copy-vs-shallow.html?m=1

以上是 Java ArrayList的拷贝构造函数是浅拷贝还是深拷贝? 的全部内容, 来源链接: utcz.com/qa/261043.html

回到顶部