2011-05-18 44 views
6

我有一個非常簡單的循環:Java:Foreach循環無法按預期在int數組上工作?

int[] positions = {1, 0, 0} 

//print content of positions 

for (int i : positions) 
{ 
    if (i <= 0) i = -1; 
} 

//print content of positions 

現在,我希望得到的是:

array: 1, 0, 0 
array: 1, -1, -1 

而是我得到

array: 1, 0, 0 
array: 1, 0, 0 

只是......爲什麼?

親切的問候, 水母

回答

19

因爲「i」是一個數組元素的副本,而不是對它的引用:) 您修改一個局部變量,而不是一個數組的元素

這段代碼相當於

for(int index = 0; index < array.length; index++) { 

int i = array[index]; 
... 
} 
+0

我花了很久才找到這個答案......我有一個數組,並實例裏面的foreach對象,後來與索引訪問他們,我得到空指針異常。所以和foreach不一樣... – Aleksandrus 2015-07-29 05:43:06

2

很簡單。如果你寫

int i = positions[0]; 

然後你複製positions[0]值,而不是通過引用。您不能從i修改positions[0]中的原始值。這同樣適用於在foreach循環中分配i

的解決方案是沒有一個foreach循環

for (int i = 0; i < positions.length; i++) 
{ 
    if (positions[i] <= 0) positions[i] = -1; 
} 
2

這種情況發生在幕後的,如果我們使用增強的for循環使用數組:

int[] array = {1,2,3,4,5}; 
for($i = 0; $i<array.length; $i++) { 
    int i = array[$i]; 
    // your statements 
    if (i <= 0) i = -1; 
} 

$i僅僅是一位不願透露姓名的內部循環的佔位符變量。看看會發生什麼:爲i指定一個新值,但在下一次迭代中加載i下一個數組項。

所以,實際上,我們不能使用增強for循環中聲明的變量來修改基礎數組。

參考:JLS 3.0,14.14.2