我在某个地方读到,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
?