使用for-each的可以是乙個陣列,或者是實現iterable這個介面的物件(collection繼承了這個介面,所有集合類都可以使用for-each)
。既然for迴圈能遍歷乙個陣列或者集合,那麼為什麼還會有乙個for-each做遍歷呢?下面(參考了jdk1.8api)舉例說明:
for迴圈遍歷每乙個timertask型別的元素,然後呼叫其cancel方法。
void cancelall(collectionc)你能從上面的**發現有什麼問題嗎?如上確實能實現遍歷操作集合元素的功能,但是迭代器變數在每個迴圈中出現三次,for-each構造擺脫了這樣的問題。
void cancelall(collectionc) 冒號(:)讀作「in」,上面的迴圈讀作「對於c中的每個timertask t」。正如您所看到的,for-each構造與泛型完美地結合在一起。它保留了所有型別的安全性。因為您不必宣告迭代器,所以不必為其提供通用宣告。
(編譯器會在背後為你做這件事,但你不必關心它。)
對兩個集合進行巢狀迭代時犯的常見錯誤:
list suits = ...;問題是「外部」集合(套裝)上被呼叫了太多次。它在外部和內部集合的內部迴圈中被呼叫,這是錯誤的。list ranks = ...;
list sorteddeck = new arraylist();// broken - throws nosuchelementexception!for (iterator i = suits.iterator(); i.hasnext(); )
for (iterator j = ranks.iterator(); j.hasnext(); )
sorteddeck.add(new card(i.next(), j.next()));
為了解決這個問題,在外迴圈的範圍內新增乙個變數來儲存這個套裝:
// fixed, though a bit uglyfor (iterator i = suits.iterator(); i.hasnext(); )那麼所有這些與for-each構造有什麼關係呢?它是為巢狀迭代量身定製的!如下所示:
for (suit suit : suits)for-each構造也適用於陣列,它隱藏了索引變數而不是迭代器。以下方法返回int陣列中值的總和:for (rank rank : ranks)
sorteddeck.add(new card(suit, rank));
>// returns the sum of the elements of a>總結:那麼你應該什麼時候使用for-each迴圈呢?任何時候都可以。它真的美化你的**。但不是在任何地方使用它。例如,考慮expurgate方法。該程式需要訪問迭代器才能刪除當前元素。for-each迴圈隱藏了迭代器,所以你不能呼叫remove。因此,for-each迴圈不能用於遍歷時有刪除操作。同樣,它不適用於需要在遍歷列表或陣列時替換元素的迴圈。最後,它不能用於必須並行迭代多個集合的迴圈。int sum(int a)
使用 Java foreach 遇到的問題
本來以為使用foreach就和使用for迴圈是一樣的效果,結果,卻遇到了意料之外的事情。先來看乙個例子 public void testarray system.out.println 輸出剛剛定義的陣列 for int x arr 通過索引給陣列元素賦值 system.out.println 通過...
hadoop的使用場合與不使用場合
1.在web中頁面的快速響應中不適合用hadoop 響應時間在ms級別 2.大量的小檔案處理不使用用hadoop 元資料較多,而且元資料是儲存在namenode中的,記憶體占用大 3.hdfs中的block 乙個block只是可以儲存乙個檔案 但是乙個檔案可以由多個塊組成,預設情況下乙個block有...
Git使用場景 命令使用場景
通過個人使用git時候的遇到的使用場景,熟悉了解相關命令,也記錄一下場景的使用方法。所有場景均在ubuntu16.04 linux 作業系統下,其他作業系統有差異的地方自行查閱相關資料。安裝git sudo apt get install git設定及檢視git配置 user.name和user.e...