foreach 循环详解
生活随笔
收集整理的這篇文章主要介紹了
foreach 循环详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
譯自:http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html
考慮如下代碼(方式一):迭代一個 collection 集合對象,然后刪除集合元素 void cancelAll(Collection<TimerTask> c) {for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); )i.next().cancel(); }以上迭代方式很丑陋,你知道,為什么丑陋?你看迭代器i 出現了3次,增加了我們出錯幾率,而且代碼如此雜亂,我們看如下代碼(方式二foreach 結構),它摒棄了這種丑陋。 void cancelAll(Collection<TimerTask> c) {for (TimerTask t : c)t.cancel(); } 利用方式一迭代 collection 集合對象 通常犯的錯誤,荔枝代碼如下: 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())); 為什么報錯? 當 ranks 的size 大于 suits.size 的時候,第3行中的 i.next() 就會拋出 NoSuchElementException 異常。
修改后的代碼如下(利用臨時變量 保存Suit實例,但代碼還是那么雜亂無章): // Fixed, though a bit ugly for (Iterator i = suits.iterator(); i.hasNext(); ) {Suit suit = (Suit) i.next();for (Iterator j = ranks.iterator(); j.hasNext(); )sortedDeck.add(new Card(suit, j.next())); } 我們看foreach 結構如何實現 for (Suit suit : suits)for (Rank rank : ranks)sortedDeck.add(new Card(suit, rank)); 等等 foreach結構還可以應用到數組的遍歷 // Returns the sum of the elements of a int sum(int[] a) {int result = 0;for (int i : a)result += i;return result; } 最后:我們什么時候不能用 foreach結構 迭代集合元素呢? case1:程序需要訪問迭代器 然后移除當前元素的時候;因為foreach 結構隱藏了 迭代器,所以無法調用remove() 方法; case2:foreach 結構不適用于 過濾 同樣也不適用于 遍歷過程中替換元素的操作。 case3:最后,foreach結構 不適用于同時并行遍歷 多個 集合元素。
雖然 foreach結構有以上缺點,但是它的應用可以覆蓋掉大多數的情況需要。
考慮如下代碼(方式一):迭代一個 collection 集合對象,然后刪除集合元素 void cancelAll(Collection<TimerTask> c) {for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); )i.next().cancel(); }以上迭代方式很丑陋,你知道,為什么丑陋?你看迭代器i 出現了3次,增加了我們出錯幾率,而且代碼如此雜亂,我們看如下代碼(方式二foreach 結構),它摒棄了這種丑陋。 void cancelAll(Collection<TimerTask> c) {for (TimerTask t : c)t.cancel(); } 利用方式一迭代 collection 集合對象 通常犯的錯誤,荔枝代碼如下: 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())); 為什么報錯? 當 ranks 的size 大于 suits.size 的時候,第3行中的 i.next() 就會拋出 NoSuchElementException 異常。
修改后的代碼如下(利用臨時變量 保存Suit實例,但代碼還是那么雜亂無章): // Fixed, though a bit ugly for (Iterator i = suits.iterator(); i.hasNext(); ) {Suit suit = (Suit) i.next();for (Iterator j = ranks.iterator(); j.hasNext(); )sortedDeck.add(new Card(suit, j.next())); } 我們看foreach 結構如何實現 for (Suit suit : suits)for (Rank rank : ranks)sortedDeck.add(new Card(suit, rank)); 等等 foreach結構還可以應用到數組的遍歷 // Returns the sum of the elements of a int sum(int[] a) {int result = 0;for (int i : a)result += i;return result; } 最后:我們什么時候不能用 foreach結構 迭代集合元素呢? case1:程序需要訪問迭代器 然后移除當前元素的時候;因為foreach 結構隱藏了 迭代器,所以無法調用remove() 方法; case2:foreach 結構不適用于 過濾 同樣也不適用于 遍歷過程中替換元素的操作。 case3:最后,foreach結構 不適用于同時并行遍歷 多個 集合元素。
雖然 foreach結構有以上缺點,但是它的應用可以覆蓋掉大多數的情況需要。
總結
以上是生活随笔為你收集整理的foreach 循环详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嘿 我真的好想你是什么歌 这首歌的完整歌
- 下一篇: 如何不用 List.clear() 方法