2016-09-24 68 views
0

所以我想做一個非常簡單的任務,取兩個相同的數組,並將第一個數組的第一個值設置爲第二個數組的最後一個值。陣列意外的行爲

下面的代碼顯示我試圖用numberArrayduplicateArray這樣做。然而,大部分的代碼是我試圖弄清楚爲什麼我得到一個奇怪的結果。

System.out.print("Normal array 1: "); 
for (int l = 0 ; l < numberArray.length ; l++){ 
    System.out.print(numberArray[l]); 
} 

System.out.print("Duplicate array 1: "); 
for (int l = 0 ; l < duplicateArray.length ; l++){ 
    System.out.print(duplicateArray[l]); 
} 
System.out.println(); 

numberArray[0] = duplicateArray[duplicateArray.length - 1]; 

System.out.print("Duplicate array 2: "); 
for (int l = 0 ; l < duplicateArray.length ; l++){ 
    System.out.print(duplicateArray[l]); 
} 
System.out.println(); 

System.out.print("Normal array 2: "); 
for (int l = 0 ; l < numberArray.length ; l++){ 
    System.out.print(numberArray[l]); 
} 

此輸出:

Normal array 1: 123 
Duplicate array 1: 123 
Duplicate array 2: 323 
Normal array 2: 323 

什麼是沒有意義的,我是,即使我推測的值設置一個對象到另一個對象,無論是正在發生變化。

我的Java的理解是這樣的:

array[x] = array2[y]; 
//value at index x of "array" now equals value at index y of "array 2" 
//however, array2 should not be changed at all since it is just referenced in the above line of code, not mutated 

我失去了很簡單的東西?我一直在絞盡腦汁想弄明白這一點。任何幫助將不勝感激。

編輯:

我已要求我提供兩個數組的聲明,所以在這裏,他們是:

int[] numberArray = {1, 2, 3}; 
int[] duplicateArray = numberArray; 

這不應該有所作爲嗎?將一個數組設置爲另一個不應該鏈接它們(或者我認爲)。

+1

你能提供我們這個數組的聲明嗎?我猜他們都引用同一個對象 –

+0

你的兩個數組指向內存中的同一個數組 –

+1

這被稱爲**別名**併發生,當兩個數組指向相同的引用。 – QBrute

回答

3

正如我評論,你既陣列指向同一陣列中存儲

int[] numberArray = {1, 2, 3}; 
int[] duplicateArray = numberArray; // duplicateArray is just a another name for numberArray 

,所以如果你有任何名稱duplicateArraynumberArray意味着你正在改變存儲陣列是由兩個指出的改變任何價值。

因此,您需要創建一個新的陣列,方法是使用System.arraycopynumberArray的元素添加到duplicateArray;

這樣

int[] numberArray = {1, 2, 3}; 
int[] duplicateArray = new int[numberArray.length]; 
System.arraycopy(numberArray , 0, duplicateArray , 0, numberArray .length); 

信息查看視覺視圖圖像

visual representation of answer

+0

謝謝,像一個魅力工作。你懂得越多。 –

+0

@Benjamin Lowry letme增加一些東西,你的願望會喜歡,並且你的歡迎Benjamin Lowry先生 –

+0

如果你想要一個數組的精確副本,你應該使用'array.clone()'而不是手動複製元素。 – Clashsoft

0

上一頁答案是正確的,以澄清,儘管陣列的整數元素是不可變的,陣列本身是不。基本上,你有兩個引用的數組; '重複'不是重複的對象,只是重複的參考。