我有一个最后的类NameAndValue.我使用System.arrayCopy()复制了一个NameAndValue对象数组,当我更改了复制数组中的NameAndValue对象时,它反映在原始数组中.
public final class NameAndValue { public String name; public String value; public NameAndValue() { } public NameAndValue(String name,String value) { this.name = name; this.value = value; } } public class Main { public static void main(String[] args) { NameAndValue[] nv = new NameAndValue[4]; nv[0] = new NameAndValue("A","1"); nv[1] = new NameAndValue("B","2"); nv[2] = new NameAndValue("C","3"); nv[3] = new NameAndValue("D","4"); NameAndValue[] nv2 = new NameAndValue[4]; System.arraycopy(nv,nv2,2); nv2[2] = new NameAndValue("Y","25"); nv2[3] = new NameAndValue("Z","26"); for (int i = 0; i < 2; i++) { NameAndValue[] nv3 = new NameAndValue[4]; System.arraycopy(nv2,nv3,4); nv3[2].value = String.valueOf(i); nv3[3].value = String.valueOf(i+1); System.out.println(nv2[2].value); System.out.println(nv2[3].value); System.out.println("-----------------------"); } } }
我得到的输出,
0 1 ----------------------- 1 2 -----------------------
在所有情况下,我应该输出25和26,对吗?为什么会改变?
解决方法
System.arrayCopy() copies object or reference to object?
参考,这是一个浅的副本.令人惊讶的是,the docs don’t say that explicitly只是隐含地介绍复制数组元素,而不是递归地复制他们引用的东西.
这与以前一样:
NameAndValue nv1 = new NameAndValue("A","1"); NameAndValue nv2 = nv1; nv2.value = "4"; System.out.println(nv1.value); // 4
每个数组元素就像上面的nv1和nv2 vars.正如nv1和nv2引用(指向)相同的底层对象,数组条目也是如此,包括当这些条目从一个数组复制到另一个数组时.