繁体   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