gaj*_*y p 4 java arrays deep-copy shallow-copy
我在某处读到System.arraycopy确实为原始数据类型创建了新副本并为对象引用创建了浅复制。
所以,我开始用下面的代码进行实验
//trying with primitive values
int a[] ={1,2,3};
int b[] = new int[a.length];
System.arraycopy(a,0,b,0,a.length);
b[0] = 9;
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
//now trying with object references
Object[] obj1 = {new Integer(3),new StringBuffer("hello")};
Object[] obj2 = new Object[obj1.length];
System.arraycopy(obj1,0,obj2,0,obj1.length);
obj1[1] = new StringBuffer("world");
System.out.println(Arrays.toString(obj1));
System.out.println(Arrays.toString(obj2));
Run Code Online (Sandbox Code Playgroud)
输出是
[1, 2, 3]
[9, 2, 3]
[3, world]
[3, hello]
Run Code Online (Sandbox Code Playgroud)
但我所期望的是
[1, 2, 3]
[9, 2, 3]
[3, world]
[3, world]
Run Code Online (Sandbox Code Playgroud)
从上面的代码中,我了解到System.arraycopy对象引用是否进行深复制如果是这样,如何 obj1[0] == obj2[0]给出true
你有一个误解。
一旦你这样做了
obj1[1] = new StringBuffer("world");
Run Code Online (Sandbox Code Playgroud)
您已替换了中的参考obj1[1]。现在这两个数组包含对不同对象的不同引用。
如果您想查看复制的内容是实际的引用,您应该尝试:
obj1[1].setLength(3);
Run Code Online (Sandbox Code Playgroud)
现在 和obj1[1]都obj2[1]应该包含字符串hel,因为您没有替换引用而是更改了内容。
| 归档时间: |
|
| 查看次数: |
4127 次 |
| 最近记录: |