2011-09-08 52 views
11
public class TestingArray { 

    public static void main(String[] args) { 

     int iCheck = 10; 
     int j = iCheck; 
     j = 11; 
     System.err.println("value of iCheck "+iCheck); 

     int[] val1 = {1,2,9,4,5,6,7}; 
     int[] val2 = val1; 
     val2[0] = 200; 
     System.err.println("Array Value "+val1[0]); 
    } 

} 

輸出:I檢查的問題在Java分配的陣列,以其它陣列

值10
數組值200

從上面的代碼我發現,如果任何數組val2正被分配給另一個數組val1,並且如果我們更改了val2數組的任何值,則結果也會反映到數組val1中,而相同的情況不會與變量賦值相關。 爲什麼?

回答

21

以下語句使val2指向同一個數組val1

int[] val2 = val1; 

如果你想製作一個副本,您可以使用val1.clone()Arrays.copyOf()

int[] val2 = Arrays.copyOf(val1, val1.length); 

對象(包括實例集合類,String,Integer等)以類似的方式工作,因爲將一個變量分配給另一個變量簡單地複製參考,使得兩者變量指的是同一個對象。如果所討論的對象是可變的,那麼通過其中一個變量對其內容進行的後續修改也將通過另一個變量可見。

原始類型(int,double等)的行爲不同:沒有涉及引用,並且賦值會創建值的副本。

+1

+1:或者使用int [] val2 = val1.clone();' –

3

簡單地說,「val1」和「val2」是指向實際數組的指針。你正在分配val2來指向與val1相同的數組。因此,改變一個,另一個看到相同的改變。要真正成爲副本,你必須克隆數組而不是分配。

1

因爲您將參考val1指定爲val2,所以它們都指向內存中的同一個對象。

1

由於Java中的數組是對象,即通過引用傳遞。