2016-07-26 258 views
0

從我所瞭解的Java(這可以說很少= P),Java對待原始值不同於對象。我能想到的一個例子是,基元是按值傳遞的,而對象是通過它們引用的值傳遞的。淺拷貝與基元

延伸這一點,我已經實現創建int數組碼,和淺複製它交給INT的一個新的數組:

public class Test { 
    public static void main(String[] args){ 
    int[] array = {2,3,4,5}; 
    int[] copy = array; 
    copy[1] = 0; 

    for (int i : copy){ 
     System.out.print(i);} 
    System.out.println(); 

    for (int i : array){ 
     System.out.print(i);} 
} 
} 

然而,輸出是:

2045 
2045 

所以,我困惑的是爲什麼兩個陣列都改變了?我認爲當我們複製原始數組時,我們只複製了元素的值(因爲我們正在處理基元)?

+0

沒有,你只是創建了第二個參考指向同一個數組。 – Stultuske

+0

ooooooh,這很有道理。因此,如果我要創建一個新的int []副本並將每個元素從數組單獨複製到for循環中,則不會發生這種情況。確實是 – javanewbie

+0

。多一點炒鍋,但它會解決你的問題 – Stultuske

回答

1

根本沒有複製數組。你所做的就是使參考文獻arraycopy指向內存中相同的數組。因此,當您通過一個參考更改數組時,另一個參考將指向相同的更改。

+0

是的,似乎我犯了一個錯誤,只複製了參考。謝謝! – javanewbie

0

數組是對象。當您設置

int[] copy = array; 

兩個copyarray指向同一個對象。您的更新

copy[1] = 0; 

更新「both」。

0

當你完成了任務copy[1] = 0,你告訴渣取其中copy指向數組,到位置1,並指定值0。因爲你也有下面的語句

int[] copy = array; 

然後copyarray指的是內存中的同一個數組。你從來沒有真正做過淺拷貝,你只分配了另一個變量來指向同一個數組。

如果你想使數組的副本,那麼你可以嘗試:

int[] copy = Arrays.copyOf(array, array.length);