2011-05-23 84 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中)。