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或doubles
, System.arraycopy
始终执行浅复制 。
数组a
更改永远不会影响数组b
(当然,除非a == b
)。
但是如果a中的新MyObject(1)发生任何变化,它也会影响
b
。
取决于你的意思。 要挑剔,对new MyObject(1)
的更改既不会影响a
也不会影响b
(因为它们只包含对象的引用 ,并且引用不会更改)。 无论您使用哪个参考来更改对象,都可以从a
和b
看到更改。
只要您专门修改对象的属性和调用方法,就是正确的。
如果更改参考点的位置,例如使用a[0] = new MyObject(1)
,那么即使使用相同的初始化数据创建对象,它们现在将指向对象的不同实例并更改为1实例将不会在另一个引用中看到(在数组b
)。