蔡纪轮*_*蔡纪轮 5 java constructor deep-copy copy-constructor
我一直对Java的容器的复制构造函数是浅拷贝还是深拷贝感到困惑?以下是我的理解:ints1,ints2,ints3是引用,所以它们位于堆栈中.inst1指向堆中的某个对象,该对象包含三个位于堆栈中的匿名引用,它们指向具有int值0,1,2的对象.
ints2 = ints1
Run Code Online (Sandbox Code Playgroud)
所以ints2指向与ints1相同的对象.因此,更改ints2中的refenences指向的对象将影响ints2中的那些对象.
ints2.set(1,0+10)
Run Code Online (Sandbox Code Playgroud)
将改变refenence ints1.get(0)的对象.
ints3 = new ArrayList<>(ints1)
Run Code Online (Sandbox Code Playgroud)
接下来是我的困惑.
如果复制构造函数是浅复制,那么虽然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]
Run Code Online (Sandbox Code Playgroud)
答案是:浅拷贝。看一下这篇文章,其中提供了有关该主题的更多详细信息:http://javarevisited.blogspot.co.uk/2014/03/how-to-clone-collection-in-java-deep-copy-vs-shallow。 html?m=1
| 归档时间: |
|
| 查看次数: |
1355 次 |
| 最近记录: |