Java中增强for循环和迭代器的优点是什么?

任何人都可以请指定我的增强for循环和java +5迭代器的优点是什么?

在Stephen Colebourne(Joda-Time,JSR-310等)中, 对每个循环迭代控制build议进行了增强,以便在Java 7中对其进行扩展:

特性摘要:

扩展Java 5 for-each循环以允许访问循环索引,无论这是第一次还是最后一次迭代,并删除当前项目。

主要优势

for-each循环几乎肯定是Java 5中最受欢迎的新function。 它的工作原理是增加了抽象级别,而不必expression如何在列表或数组中循环的底层细节(使用索引或迭代器),开发人员只是说,他们想循环和语言照顾其余的。 但是,只要开发人员需要访问索引或删除项目,所有的好处都会丢失

针对每项工作的原始Java 5在针对80%案例的若干问题上采取了相对保守的立场。 然而,循环是编码中的一种常见forms,其余的20%没有被处理,代表了一大堆代码。

将循环从for循环转换为索引或迭代器的过程是痛苦的。 这是因为旧的循环风格,如果明显低级别, 是更详细和不太清楚 。 这也是很痛苦的,因为大多数IDE不支持这种“重构”。

主要收益:

一个通用的编码习惯用比现在更高的抽象expression。 这有助于可读性和清晰度

总而言之,增强型for循环提供了一个简洁的高级语法来遍历列表或数组,从而提高清晰度和可读性。 但是,它会遗漏一些部分:允许访问索引循环或删除项目。

也可以看看

  • Java 7 – 用于每个循环控制访问
  • 斯蒂芬Colebourne的原始写法

对我来说,很明显,主要优点是可读性。

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

显然比类似的东西好

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

我想这是在这里介绍它的文档页面非常概括。

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

如此真实..

迭代器只是混乱。 此外,这是一个错误的机会。 迭代器variables在每个循环中出现三次:这是两次错误的机会。 for-each构造摆脱了混乱和错误的机会。

究竟

当您看到冒号(:)时,将其读为“in”。上面的循环读作“for c中的每个TimerTask t”。正如您所看到的,for-each构造与generics完美地结合在一起。 它保留了所有types的安全性,同时消除了剩余的杂波。 因为你不必声明迭代器,所以你不必为它提供一个通用的声明。 (编译器在背后为你做这个,但是你不需要关心它。)

我想总结一下,但是我认为这个页面几乎完美无缺。

你可以遍历任何Iterable集合和数组。 性能差异不是你应该担心的。

可读性很重要。

 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(或增强的)只能用于获取元素,不能修改数组中的元素。
有关更多信息,请参阅此 。

更干净的语法! 从性能的angular度来看没有什么不同,因为这只是程序员的便利。

正如其他人所说,增强型for循环提供了更清晰的语法,可读代码和更less的types。

另外,它也避免了可能的“索引超出限制”的错误情况。 例如,当您手动迭代列表时,可能会以错误的方式使用索引variables,如:

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

这会抛出exception。 但是为了增强for循环,我们将迭代任务留给编译器。 它完全避免了错误的情况。

主要的缺点是创build一个迭代器,这是不是有一个基于索引的循环。 这通常是正常的,但是在性能关键的部分(例如实时应用程序,当它需要每秒运行数百次)时,可能会导致主要的GC干预…

正如其他人已经回答,这是一个清洁的语法糖。 如果你比较类的迭代器循环,你会发现一个更less的variables,你将不得不申报。

foreach / enhanced for / for循环用于为数据对象提供光标。 当您按照“逐行扫描文件”或“通过logging遍历结果集logging”这样的方式思考时,这一点特别有用,因为它很简单直接。

与基于索引的方法相比,这也提供了更一般和更好的迭代方式,因为调用者(for循环)不再需要知道如何获取值或集合大小或其他实现细节。

它更简洁。 唯一的问题是空检查。

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

减less打字! 加上编译器的更多帮助

增强的for-loop提供了以下主要优势:

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

它消除了在上面的非增强版本中每次迭代中重复计算list.size() 。 这是一个重要的性能优势。

或者,您可以使用附加variables按如下方式计算循环外部的大小:

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