第46條:for-each循環優先於傳統的for循環

1.代碼直觀對比

傳統for循環

for (Iterator<String> i = list.iterator();i.hasNext();) {
            doSomething(i.next());
        }

        for (int i = 0; i < list.size(); i++) {
            doSomething(list.get(i));
        }

for-each

for (String str : list) {
            doSomething(str);
        }

2.for-each的優點

比傳統的for循環:html

  • 簡潔性
  • 有效預防bug
  • 不用擔憂性能損失

關於有效預防bug以及簡潔性,請看如下代碼:數組

// 不簡潔,同時易誤致使bug
        for (Iterator<String> i = list.iterator();i.hasNext();) {
            for (Iterator<String> j = list2.iterator();j.hasNext();) {
                doSomething(i.next(),j.next());
            }
        }

        // 簡潔
        for (String s : list) {
            for (String s1 : list2) {
                doSomething(s,s1);
            }
        }

3.不能使用for-each狀況

(1)過濾
若是須要遍歷集合,並刪除選定的元素,就須要使用顯示的迭代器,以即可以調用它的remove方法。性能

// 正確作法
        for (Iterator<String> i = list.iterator();i.hasNext();) {
            i.next();  // 指向要刪除的元素
            i.remove();
        }
        // 錯誤作法
        for (int i = 0; i < list.size(); i++) {
            list.remove(i);
        }
        // 錯誤作法
        for (String s : list) {
            list.remove(s);
        }

關於刪除集合元素參考:Java循環刪除集合多個元素的正確打開方式code

(2)轉換
若是須要遍歷全部元素,而後從新設定某些值,那麼就須要李彪迭代器或者數組索引,以便設定元素的值。htm

(3)平行迭代
就是並行地同時遍歷多個集合,須要顯示地控制迭代器或者索引變量,以便全部迭代器或者索引變量均可以獲得同步前移。blog

相關文章
相關標籤/搜索