簡體   English   中英

Java中增強的for循環和迭代器有什么優勢?

[英]What are the advantages of Enhanced for loop and Iterator in Java?

我想知道 Java +5 中增強的 for 循環和迭代器的優點是什么?

在 Stephen Colebourne(Joda-Time、JSR-310 等)中很好地總結了優點和缺點, 增強了每個循環迭代控制提案,以便在 Java 7 中對其進行擴展:

功能摘要:

擴展 Java 5 for-each 循環以允許訪問循環索引,無論這是第一次還是最后一次迭代,並刪除當前項。

主要優勢

for-each 循環幾乎可以肯定是 Java 5 中最流行的新特性。它之所以有效,是因為它增加了抽象級別——而不是必須表達如何圍繞列表或數組循環的低級細節(使用索引或迭代器),開發人員只需聲明他們想要循環,語言會負責其余的工作。 但是,一旦開發人員需要訪問索引或刪除項目,所有好處都將丟失

每項工作的原始 Java 5 在旨在解決 80% 情況的許多問題上都采取了相對保守的立場。 然而,循環是編碼中的一種常見形式,剩下的 20% 未被處理代表了大量代碼。

將循環從 for each 轉換回基於索引或迭代器的過程是痛苦的。 這是因為舊的循環樣式如果顯着降低級別,則更加冗長且不太清晰 這也很痛苦,因為大多數 IDE 不支持這種“解重構”。

主要好處:

一個常見的編碼習慣用比目前更高的抽象來表達。 這有助於可讀性和清晰度

...

總而言之,增強的 for 循環提供了一種簡潔的高級語法來循環列表或數組,從而提高了清晰度和可讀性。 但是,它遺漏了一些部分:允許訪問索引循環或刪除項目。

也可以看看

對我來說,很明顯,主要優勢是可讀性。

for(Integer i : list){
   ....
}

顯然比類似的東西好

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

我認為這里介紹它的文檔頁面幾乎可以總結出來。

迭代集合比它需要的更丑陋

如此真實..

迭代器只是混亂。 此外,這是犯錯的機會。 迭代器變量在每個循環中出現 3 次:這是兩次出錯的機會。 for-each 結構消除了混亂和出錯的機會。

確切地

當您看到冒號 (:) 時,將其讀作“in”。 上面的循環讀作“對於 c 中的每個 TimerTask t”。 如您所見,for-each 構造與泛型完美結合。 它保留了所有類型的安全性,同時消除了剩余的混亂。 因為您不必聲明迭代器,所以您不必為它提供通用聲明。 (編譯器會在你背后為你做這件事,但你不必關心它。)

我想總結更多,但我認為該頁面做得非常完美。

您可以迭代任何可迭代的集合以及數組。 性能差異根本不是您應該擔心的。

可讀性很重要。

Prefer this    
for (String s : listofStrings) 
    {
     ... 
    }

over

    for (Iterator<String> iter = listofStrings.iterator(); iter.hasNext(); )
    {
     String s = iter.next();
     ...
    }

請注意,如果您需要在迭代時刪除元素,則需要使用Iterator

例如,

List<String> list = getMyListofStrings(); 

    for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) 
    {
        String s = iter.next();
        if (someCondition) {
            iter.remove(); 
        }
    }

您不能使用for(String s : myList)刪除列表中的元素。
還要注意,遍歷數組時,foreach(或增強的for)只能用來獲取元素,不能修改數組中的元素。
有關詳細信息,請參閱

主要缺點是創建了一個迭代器,它沒有基於索引的循環。 這通常沒問題,但在性能關鍵部分(例如在實時應用程序中,當它必須每秒運行數百次時),它可能會導致主要的 GC 干預......

更簡潔的語法! 從性能的角度來看沒有區別,因為這只是對程序員的一種方便。

正如其他人所說,增強的 for 循環提供了更清晰的語法、可讀的代碼和更少的類型。

此外,它還避免了可能的“索引超出范圍”錯誤情況。 例如,當您手動迭代列表時,您可能會以錯誤的方式使用索引變量,例如:

for(int i=0; i<= list.size(); i++)

這將引發異常。 但是在增強 for 循環的情況下,我們將迭代任務留給編譯器。 它完全避免了錯誤情況。

正如其他人已經回答的那樣,它是更清潔的語法糖。 如果你比較類迭代器循環,你會發現你需要聲明的變量少了一個。

它更簡潔。 唯一的問題是空檢查。

for (String str : strs) {  // make sure strs is not null here
    // Do whatever
}

foreach/增強的 for/for 循環用於在數據對象上提供光標。 當您考慮“逐行遍歷文件”或“逐記錄遍歷結果集”時,這特別有用,因為它易於實現。

與基於索引的方法相比,這也提供了一種更通用和改進的迭代方式,因為調用者(for 循環)不再需要知道如何獲取值或集合大小或其他實現細節。

少打字! 加上來自編譯器的更多幫助

增強的 for 循環具有以下主要優點:

for (int i=0; i <= list.size(); i++)

它消除了上述非增強版本中每次迭代時list.size()的重復計算。 這是一個重要的性能優勢。

或者,您可以使用附加變量按如下方式計算循環外的大小:

int size = list.size();
for (int i=0; i <= size; i++)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM