2015-10-18 117 views
4

在一個類中我有一個私人陣列數組賦值與for循環分配

private boolean[][][] array; 

稍後宣佈爲

array = new boolean[2][100][100]; //* 

在某一點上我想覆蓋在第一陣列第一維與第一維的第二陣列。我認爲這應該工作

array[0] = array[1]; 

但這產生了錯誤的行爲。我試過這個簡單的for-loop:

for (int column = 0; column < array[0].length; column++) { 
    for (int row = 0; row < array[0][0].length; row++) { 
     array[0][column][row] = array[1][column][row]; 
    } 
} 

它按預期工作。

爲什麼第一個代碼段沒有工作?

*第一個維度靜態爲2,但其他實際來自另一個數組。爲了清晰我刪除了它們。

+0

順便說一句,我不知道我是否選擇了最具描述性的標題。也許「直接排列vs ...」?我不確定前面的作業是否有特定的名稱。 – problemofficer

回答

5

第一個代碼片段沒有工作,因爲它沒有副本陣列方向,它別名它。數組是對象,因此該分配會創建對同一維的第二個引用,並將其分配給第一維。這就是爲什麼你得到一個不同的(和不正確的)行爲。

這裏是正在發生的事情的圖示:

Reassignment

分配滴從頂部尺寸索引零的100×100陣列,並且在尺寸1到100×100陣列的引用替換它此時對第一個數組的任何修改都會反映在第二個數組中,反之亦然。

如果你不關心保持陣列的先前版本重新分配後,您可以分配一個全新的數組元素1,像這樣:

array[0] = array[1]; 
array[1] = new boolean[100][100]; 
3

此行

array[0] = array[1]; 

美國存儲在array[1]對象引用將現在還保存在array[0]。由於Java中的數組是對象引用,現在array[0]array[1]指向到相同的位置。

如果您想要/需要清除數組的數據,請使用循環:for,while,do-while,您感覺更舒適。

-1

好吧,我不認爲你可以執行復制或者甚至是簡單的調用,除非你以「正確的方式」處理你的數組。

因此,像

array[0]=array[1]; 

array[0][1]=array[1][1]; 

將無法​​正常工作,但如果你寫

array[0][0][0]=array[1][0][0]; 

它會工作,我猜,因爲編譯器肯定你在這裏討論相同的數組。

+0

我猜測後者只能用,因爲右手語句的計算結果是保存在數組中的類型。 – problemofficer