gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:54:25 26 4
gpt4 key购买 nike

我一直困惑Java的容器的拷贝构造函数到底是浅拷贝还是深拷贝?下面是我的理解:ints1、ints2、ints3 是引用,因此它们位于堆栈中。inst1 指向堆中的某个对象,该对象持有三个位于堆栈中的匿名引用,它们分别指向具有 int 值 0、1、2 的对象。

ints2 = ints1

因此 ints2 指向与 ints1 相同的对象。因此,ints2 中的引用指向的更改对象将影响 ints2 中的对象。

ints2.set(1,0+10)

将更改 refenence 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 - Java的ArrayList的拷贝构造函数是浅拷贝还是深拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47862684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com