java.lang.System.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)的引用。 但是,如果a中的new MyObject(1)有任何更改,它也会影响b

以上陈述是否正确?

以上陈述是否正确?

是的,你是对的。

无论数组是否包含引用或基元(如int s或doublesSystem.arraycopy 始终执行浅复制

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

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

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

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

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