2011-05-23 113 views
0

System.arraycopy()是一种浅拷贝方法。java.lang.System.arraycopy()是否使用浅拷贝?

对于一个基本类型的阵列,将所述值从一个阵列复制到另一个:

int[] a = new int[]{1,2}; 
int[] b = new int[2]; 
System.arraycopy(a, 0, b, 0, 2); 

b将{1,2}现在。 a中的更改不会影响b

对于非原始类型的数组,它将从一个阵列复制对象的引用到另一:

MyObject[] a = new MyObject[] { new MyObject(1), new MyObject(2)}; 
MyObject[] b = new MyObject[2]; 
System.arraycopy(a, 0, b, 0, 2); 

b将包含new MyObject(2)new MyObject(1)参考,现在。但是,如果a中的new MyObject(1)有任何更改,它也会影响b

以上陈述是否正确?

+2

您对此有何看法?你有没有尝试写一些示例代码? – Pops 2011-05-23 19:06:23

+0

为什么不打开一个IDE并找出答案? – SWeko 2011-05-23 19:07:32

+0

那么没有示例代码-1,而不是IDE -1?如果你是教授,你会在下个学期出去。有时我需要一个快速的答案。在你真正尝试过之前,你是否问过你的同事一些问题?如果永远不会,你是聪明的TOOOOOOOO。如果你是一个如此聪明的人,你需要耐心等待其他普通人。请稍后忽略我的任何进一步问题,因为大部分时间我可能会问,没有任何示例和IDE的东西。 – 5YrsLaterDBA 2011-05-23 20:42:47

回答

0

以上声明是否正确?

是的,你是对的。

System.arraycopy总是做一个浅拷贝,不管数组包含引用或原语,例如int S或doubles秒。

变化阵列a绝不会影响阵列b(当然,除非a == b)。

但如果在a新的MyObject(1)中的任何改变,它会影响b为好。

取决于你的意思。挑剔,更改了new MyObject(1)既不会影响a也不b(因为它们只包含引用的对象,并参考不会改变)。无论您使用哪个参考来更改对象,该更改都将在ab之间可见。

0

只要您具体修改对象的属性并调用方法,就是正确的。

如果更改参考点的位置(例如a[0] = new MyObject(1)),那么即使对象是使用相同的初始化数据创建的,它们现在也会指向该对象的不同实例,并且不会看到对某个实例的更改在另一个参考中(在数组b中)。