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

Java中增强的for循环和迭代器的优点是什么?,java,foreach,Java,Foreach,有谁能告诉我java+5中增强的for循环和迭代器的优点是什么?更简洁的语法! 从性能角度看,这没有什么区别,因为这只是程序员的一种方便。对我来说,很明显,主要的优势是可读性 for(Integer i : list){ .... } 显然比类似的东西要好 for(int i=0; i < list.size(); ++i){ .... } for(int i=0;i

有谁能告诉我java+5中增强的for循环和迭代器的优点是什么?

更简洁的语法!
从性能角度看,这没有什么区别,因为这只是程序员的一种方便。

对我来说,很明显,主要的优势是可读性

for(Integer i : list){
   ....
}
显然比类似的东西要好

for(int i=0; i < list.size(); ++i){
  ....
}
for(int i=0;i
我认为介绍它的文档页面对其进行了总结

对集合进行迭代比需要的更糟糕

真的

迭代器只是杂乱无章。此外,这是一个出错的机会。迭代器变量在每个循环中出现三次:这是两次出错的机会。for-each构造消除了混乱和出错的机会

正是

当您看到冒号(:)时,将其读作“in”。上面的循环读作“for each TimerTask t in c”。正如您所看到的,for each构造与泛型完美结合。它保留了所有的类型安全性,同时消除了剩余的混乱。因为不必声明迭代器,所以不必为它提供泛型声明。(编译器会在背后为您执行此操作,但您无需担心。)


我想总结一下,但我认为该页面做得非常完美。

正如其他人已经回答的那样,它是cleaner的语法糖。如果与类迭代器循环进行比较,您将发现需要声明的变量少了一个。

您可以对任何可迭代的集合以及数组进行迭代。 而且性能差异根本不值得担心

可读性非常重要

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

over

    for (Iterator<String> iter = listofStrings.iterator(); iter.hasNext(); )
    {
     String s = iter.next();
     ...
    }
不能使用
for(字符串s:myList)
删除列表中的元素。
还要注意的是,在遍历数组时,foreach(或增强型for)只能用于获取元素,不能修改数组中的元素。

有关更多信息,请参阅。

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

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

少打字!加上编译器提供的更多帮助,增强的for循环提供了更清晰的语法、可读的代码和更少的类型

此外,它还避免了可能出现的“索引越界”错误情况。例如,当您手动迭代列表时,可能会以错误的方式使用索引变量,如:

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

for(int i=0;i斯蒂芬·科尔伯恩(Joda Time,JSR-310等)关于在Java 7中扩展它的提议很好地总结了它的优点和缺点:

专题摘要: 扩展Java5 for each循环,以允许访问 循环索引,这是否是第一个 或上一次迭代,并删除 当前项目

主要优势 for-each循环几乎肯定是最新的 Java 5的流行功能。它可以工作 因为它增加了抽象性 水平-不必表达 如何循环的底层细节 围绕列表或数组(带有索引 或者迭代器),开发人员只需 声明它们要循环,并且 语言处理其余的事情。 然而,随着时间的推移,所有的好处都失去了 一旦开发人员需要访问 索引或删除项目

每项工作的原始Java5 相对保守的立场 旨在解决该问题的问题数量 80%的情况。但是,循环就是这样一种情况 编码中的常见形式 其余20%未解决 表示重要的代码体

转换循环的过程 从中返回,以便每个都成为索引或 基于迭代器是痛苦的 因为旧的循环样式如果 显著更低的级别,更高 冗长且不太清晰。它也是 大多数IDE都不支持,这很痛苦 这种“去重构”

主要好处: 一个常见的编码习惯用法在 比目前更高的抽象性。 这有助于提高可读性和清晰度

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

另见

foreach/enhanced for/for循环用于在数据对象上提供光标。这在考虑“逐行遍历文件”或“逐行遍历结果集记录”时尤其有用,因为它易于实现


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

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

增强的for循环提供以下主要优势:

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

事实上,增强的for循环在很多情况下可能会慢一点。但它是可忽略的。哦,我不知道。只是好奇在什么情况下..有指针/引用吗?这是我的理解(但我可能错了)增强的for循环编译为与常规for循环相同的字节码。如果这是正确的,那么运行时行为应该是相同的。您还需要添加一行来提取值。优点是它消除了许多简单的样板文件和其中的任何错误。毕竟,有大量代码ust以这样或那样的方式对集合进行迭代。这当然不一定是个问题:我可以有一个在某些索引处为空的对象列表或数组,而且我不希望无法迭代ov
for (int i=0; i <= list.size(); i++)
int size = list.size();
for (int i=0; i <= size; i++)