编程语言
首页 > 编程语言> > java-具有原始和对象引用的System.arraycopy()浅表复制或深度复制

java-具有原始和对象引用的System.arraycopy()浅表复制或深度复制

作者:互联网

我在某处读到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));

和输出是

[1, 2, 3]
[9, 2, 3]
[3, world]
[3, hello]

但是我期望的是

[1, 2, 3]
[9, 2, 3]
[3, world]
[3, world]

从上面的代码中,我了解到System.arraycopy确实对对象引用进行了深层复制
如果是这样,那么obj1 [0] == obj2 [0]如何得出true

解决方法:

你有一个误解.

一旦你做

obj1[1] = new StringBuffer("world");

您已替换了obj1 [1]中的引用.现在,这两个数组包含对不同对象的不同引用.

如果要查看复制的是实际参考,则应尝试:

obj1[1].setLength(3);

现在,obj1 [1]和obj2 [1]都应包含字符串hel,因为您没有替换引用,而是更改了内容.

标签:shallow-copy,deep-copy,arrays,java
来源: https://codeday.me/bug/20191111/2020456.html