java.lang.System.arraycopy()是否使用浅拷贝?

时间:2011-05-23 19:03:50

标签: java arraycopy

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(1)new MyObject(2)的引用。但是,如果new MyObject(1)中的a发生任何更改,也会影响b

以上陈述是否正确?

2 个答案:

答案 0 :(得分:0)

只要您专门修改对象的属性和调用方法,就是正确的。

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

答案 1 :(得分:0)

  

以上陈述是否正确?

是的,你是对的。

System.arraycopy 始终执行浅拷贝,无论数组是否包含引用或基元,例如int s或doubles s。

数组a中的更改永远不会影响数组b(当然,除非a == b)。

  

但如果a中的新MyObject(1)发生任何变化,也会影响b

取决于你的意思。要挑剔,对new MyObject(1)的更改既不会影响a也不会影响b(因为它们只包含引用到对象,而引用不会改变)。无论您使用哪个引用来更改对象,都可以从ab看到更改。