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
。
以上陈述是否正确?
答案 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
(因为它们只包含引用到对象,而引用不会改变)。无论您使用哪个引用来更改对象,都可以从a
和b
看到更改。