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++)