[英]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.