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