使用 Java foreach 遇到的問題

2021-07-26 20:02:05 字數 1783 閱讀 2247

本來以為使用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...