2012-08-13 58 views
5

我今天正在處理比較大的String陣列。 (大小約400 x 400)我想知道如何讓一個陣列與另一個陣列完全相同。例如,Java:陣列如何工作

String[][] array1 = new String[400][400]; 
String[][] array2 = array1; 

是製造一個陣列等於另一個同樣的事情通過每個元件循環和使它等於另一個陣列的相應位置? (如下所示)

for(int y = 0; y < 400; y++) { 
    for(int x = 0; x < 400; x++) { 
     array2[x][y] = array1[x][y]; 
    } 
} 

現在循環方法與使一個數組與另一個數組相等是一回事嗎?還是比其他的更快?就個人而言,我認爲第一個會更快,因爲在遞歸之前沒有遞歸或者不得不手動分配內存給array2。但是,我不知道從哪裏開始尋找這些信息,我想了解Java如何處理這些事情。

+0

看看[Java Arrays](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html) – adatapost 2012-08-13 02:58:31

+3

我也認爲你對遞歸的定義感到困惑。 – 2012-08-13 03:00:13

+0

有趣,但我沒有看到任何關於此,除了在底部提到arrayCopy方法,似乎沒有任何關係使一個數組等於另一個等號 Doug Ramsey:我可能是因爲我真的不知道事情如何發揮作用,因爲我知道他們實際上工作。 – CoderTheTyler 2012-08-13 03:01:47

回答

12

不,它不是一回事:數組是參考對象,所以array2成爲array1的別名,而不是其副本。您對array2元素所做的任何分配都將通過array1變爲「可見」,反之亦然。如果您想製作單維數組的副本,則可以使用其clone()方法;注意副本將是,即陣列的單個元素將而不是被克隆(使技巧不適用於您在文章中描述的2-D數組)。

+0

哇......我從來沒有意識到這一點。這可能可以解釋爲什麼我的很多帶數組的程序不能按照我希望的方式工作。感謝啓發! – CoderTheTyler 2012-08-13 03:04:59

5

array2 = array1不會複製元素,只有數組引用。所以array2array1都引用相同的底層陣列。

這是很容易確定自己:

String[][] array1 = new String[4][4]; 
array1[0][0] = "some string"; 
String[][] array2 = array1; 
array1[0][0] = "another string"; 
System.out.println("array2: " + array2[0][0]); 
array2[0][0] = "a third string"; 
System.out.println("array1: " + array1[0][0]); 
+0

與@ dasblinkenlight的答案相同,但僅舉一個例子。謝謝! :d – CoderTheTyler 2012-08-13 03:05:33

1

嗯,我認爲當你做一個數組等於另一個,只需更改參考。例如:

ARRAY 1 - * [] [] [] [] ... [] [],其中*是數組的引用1
陣列2 - & [] [] [] [] .. 。[] [],其中&是參考陣列2

然後設置陣列1 =陣列2 陣列1將簡單其引用改變爲&,並開始在存儲器參考&

1

第二行中讀取第一個代碼示例是創建一個類型爲String []的引用變量,該引用變量引用與ref相同的二維數組對象erence array1指的是。內存中只有一個二維數組,但有兩個引用變量引用它,即array1和array2。

你似乎對遞歸的定義感到困惑,所以我會在這裏指出你的意見:Recursion in Computer Science