代码之家  ›  专栏  ›  技术社区  ›  Mahmoud Saleh

Java中的循环和迭代器的优势是什么?

  •  23
  • Mahmoud Saleh  · 技术社区  · 15 年前

    有谁能告诉我在Java + 5中增强了for循环和迭代器的优势?

    12 回复  |  直到 10 年前
        1
  •  21
  •   JodaStephen    12 年前

    斯蒂芬·科尔伯恩(Joda Time,JSR-310等)很好地总结了其优点和缺点。 Enhanced for each loop iteration control 建议在Java 7中扩展它:

    功能摘要:

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

    主要优势

    for each循环几乎肯定是最新的 来自Java 5的流行特性。 它工作 因为它增加了抽象 水平-而不是必须表达 如何循环的低级细节 围绕列表或数组(带有索引 或者迭代器),开发者只需 声明他们想要循环 语言照顾其他人。 但是,所有的利益都会因为 一旦开发者需要访问 索引或删除项 .

    每个工作的原始Java 5 相对保守的立场 旨在解决的问题数量 80%例。然而,循环是这样的 在编码中常见的形式是 其余20%未解决 表示一个重要的代码体。

    转换循环的过程 从中返回每个要成为索引的,或 基于迭代器是很痛苦的。这是 因为 旧的循环样式 如果 显著降低水平, 是更多 冗长而不清晰 . 它也是 疼痛,因为大多数IDE不支持 这种“去重构”。

    主要效益:

    一个常见的编码习语表达在 比现在更抽象。 这种艾滋病 可读性和清晰度 .

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

    也见

        2
  •  12
  •   Carl Manaster    15 年前

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

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

    显然比

    for(int i=0; i < list.size(); ++i){
      ....
    }
    
        3
  •  4
  •   Lee Jarvis    12 年前

    我认为这在介绍它的文档页面中得到了很好的总结。 here .

    迭代集合比需要的更糟糕

    如此真实…

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

    确切地

    当你看到冒号(:)读作in.它保留了所有类型的安全性,同时消除了剩余的混乱。因为不必声明迭代器,所以不必为它提供泛型声明。(编译器在你背后为你做这个,但你不必担心它。)

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

        4
  •  3
  •   Carl Manaster    15 年前

    您可以迭代任何可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(或enhanced for)只能用于获取元素,不能修改数组中的元素。
    有关详细信息,请参阅 this .

        5
  •  2
  •   Gopi    15 年前

    更清晰的语法! 从性能的角度来说没有区别,因为这只是程序员的一个便利。

        6
  •  1
  •   Veera    15 年前

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

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

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

    这将引发异常。但是,为了增强for循环,我们将把迭代任务留给编译器。它完全避免了错误情况。

        7
  •  1
  •   Gyscos    15 年前

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

        8
  •  0
  •   Dennis C    15 年前

    正如其他人已经回答的,这是一个语法糖为清洁。如果与类迭代器循环进行比较,您将发现少了一个必须声明的变量。

        9
  •  0
  •   user268396    15 年前

    foreach/enhanced for/for循环用于在数据对象上提供光标。当您考虑到_156;逐行_157;或_156;逐行浏览结果集记录时,这一点尤其有用,因为它简单且易于实现。

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

        10
  •  0
  •   fastcodejava    15 年前

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

    for (String str : strs) {  // make sure strs is not null here
        // Do whatever
    }
    
        11
  •  -2
  •   Thorbjørn Ravn Andersen    15 年前

    少打字!还有来自编译器的更多帮助

        12
  •  -3
  •   William Price    10 年前

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

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

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

    或者,您可以使用一个附加变量计算循环外部的大小,如下所示:

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