本來以為使用foreach就和使用for迴圈是一樣的效果,結果,卻遇到了意料之外的事情。
先來看乙個例子:
public
void
testarray() ;
system.out.println("----輸出剛剛定義的陣列----");
for (int x : arr)
//通過索引給陣列元素賦值
system.out.println("----通過foreach迴圈修改陣列元素的值----");
for (int x : arr)
//迴圈輸出建立的陣列
system.out.println("----修改後,foreach重新輸出陣列元素的值----");
for (int x : arr)
}
執行出來的結果:
---
-輸出剛剛定義的陣列--
--13
24--
--通過foreach迴圈修改陣列元素的值--
--26
48--
--修改後,foreach重新輸出陣列元素的值--
--13
24
咦,怎麼沒有修改過來?
網上查詢答案,這個說得比較明白:
給你舉乙個例子,你看一下可能比較能理解:
for(int element:array1)//雖然可以輸出十個隨機數,但並沒有把十個隨機數賦給array1陣列。
這其中的執行過程是這樣的
element = array1[i]
element = 隨機數
syso(element)
element是個基本資料型別,他不指向陣列元素的位址,他只代表數字他自己。
當理解了這個例子,你現在就應該知道foreach這東西的限制了。那就是不能修改陣列元素,為什麼呢?因為每一次loop你只是獲得了當前元素的值,卻沒有獲得當前元素在陣列中的物件控制代碼。這樣你就無法直接操作對應的控制代碼。
所以當你想遍歷陣列並只想獲得元素值的時候才用foreach。其他的時候比如想修改陣列,或者想獲得index的時候就別用foreach。
現在,我們是想修改陣列的值,那麼就不能使用foreach了,還是使用for迴圈吧:
public
void
testarray1() ;
system.out.println("----輸出剛剛定義的陣列----");
for (int x : arr)
//通過索引給陣列元素賦值
system.out.println("----通過迴圈變數給陣列元素賦值----");
for (int i = 0; i < arr.length; i++)
//迴圈輸出建立的陣列
system.out.println("----修改後,foreach重新輸出陣列元素的值----");
for (int x : arr)
}
執行結果如下:
---
-輸出剛剛定義的陣列--
--13
24--
--通過迴圈變數給陣列元素賦值--
--26
48--
--修改後,foreach重新輸出陣列元素的值--
--26
48
長籲一口氣,終於恢復正常了。
參考:
java for each的使用場景和使用方法
使用for each的可以是乙個陣列,或者是實現iterable這個介面的物件 collection繼承了這個介面,所有集合類都可以使用for each 既然for迴圈能遍歷乙個陣列或者集合,那麼為什麼還會有乙個for each做遍歷呢?下面 參考了jdk1.8api 舉例說明 for迴圈遍歷每乙個...
java foreach與for遍歷效率對比
先看陣列型別的迭代器,拿arraylist來說吧。arraylistlist new arraylist 一般迭代器的寫法 for iterator iterator list.iterator iterator.hasnext for each隱藏迭代器的寫法,避免混亂和出錯的可能,也更簡潔。fo...
使用UICollectionView遇到的各種坑
1 頭檢視和尾部檢視的新增 uicollectionreusableview headerview collectionview dequeuereusablesupplementaryviewofkind uicollectionelementkindsectionheader withreuse...