【问题标题】:Iterate with for loop or while loop?使用 for 循环或 while 循环进行迭代?
【发布时间】:2010-09-11 01:55:44
【问题描述】:

我经常看到这样的代码:

Iterator i = list.iterator();
while(i.hasNext()) {
    ...
}

但我这样写(当 Java 1.5 不可用或每个都不能使用时):

for(Iterator i = list.iterator(); i.hasNext(); ) {
    ...
}

因为

  • 它更短
  • 它将i 保持在更小的范围内
  • 它减少了混淆的机会。 (是i在外面使用 尽管? i 声明在哪里?)

我认为代码应该尽可能简单易懂,这样我只需要编写复杂的代码来完成复杂的事情。你怎么看?哪个更好?

发件人:http://jamesjava.blogspot.com/2006/04/iterating.html

【问题讨论】:

    标签: java for-loop iterator


    【解决方案1】:

    两者都可以。我自己用for(),不知道有没有编译问题。我怀疑它们都被优化到几乎相同的东西。

    【讨论】:

      【解决方案2】:

      我更喜欢 for 循环,因为它还将迭代器的范围设置为仅 for 循环。

      【讨论】:

      • 我在那个问题上的得分是 50/50,但你的范围论点是有道理的。
      • 请注意,从 Java 6 开始,迭代的首选习惯用法(如果您不需要索引循环)是: for (MyClass elem : list) { //do something with elem } 我在这里评论是因为这会出现一些谷歌搜索。
      【解决方案3】:

      如果您只打算使用一次迭代器并将其丢弃,则首选第二种形式;否则你必须使用第一种形式

      【讨论】:

        【解决方案4】:

        为什么不使用 for-each 结构? (我有一段时间没用过 Java,但 C# 中就有这个,我很确定 Java 1.5 也有这个):

        List<String> names = new ArrayList<String>();
        names.add("a");
        names.add("b");
        names.add("c");
        
        for (String name : names)
            System.out.println(name.charAt(0));
        

        【讨论】:

        • 我指定了不能使用的情况。
        • 如果您需要调用 Iterator.remove(),则不能使用此构造的一次,因为迭代器只是被推断出来的,而不是显式的。
        • 如果还需要获取索引也不能使用,可以从ListIterator获取。
        【解决方案5】:

        我同意“for”循环在迭代时更清晰、更合适。

        “while”循环适用于轮询,或者满足退出条件的循环数将根据循环内的活动而变化。

        【讨论】:

          【解决方案6】:

          正如您所指出的,我认为范围是这里最大的问题。

          在“while”的例子中,迭代器是在循环外声明的,所以循环结束后它会继续存在。如果稍后再次使用相同的迭代器,这可能会导致问题。例如。你可能会忘记在另一个循环中使用它之前对其进行初始化。

          在“for”示例中,迭代器是在循环内部声明的,因此它的作用域仅限于循环。如果你在循环之后尝试使用它,你会得到一个编译器错误。

          【讨论】:

            【解决方案7】:

            虽然两者都很好,但我倾向于使用第一个示例,因为它更易于阅读。

            使用 while() 循环的每一行发生的操作更少,使代码新手更容易理解发生了什么。

            这种类型的构造还允许我将初始化分组到一个公共位置(在方法的顶部),这也简化了我的评论,以及第一次阅读它的人的概念化。

            【讨论】:

            • 我认为仅在需要时声明变量是一个好习惯。想象一个大方法:当你开始使用声明的变量时,它们甚至可能不再在同一个页面上!
            【解决方案8】:

            我同意应该尽可能使用 for 循环,但有时会有更复杂的逻辑来控制循环体中的迭代器。在这种情况下,您必须使用 while。

            【讨论】:

              【解决方案9】:

              while、for 和 foreach 结构有适当的用途:

              • while - 如果您正在迭代并且是否循环的决定因素仅基于条件,请使用此选项。在这个循环结构中,保持索引只是次要问题;一切都要视情况而定

              • for - 如果您正在循环并且您主要关心的是数组/集合/列表的索引,请使用此选项。如果您最有可能以特定顺序遍历所有元素(例如,向后遍历排序列表),则使用 for 会更有用。

              • foreach - 如果您只需要浏览您的收藏而不考虑顺序,请使用此选项。

              显然上述情况也有例外,但这是我在决定使用哪个时使用的一般规则。话虽如此,我倾向于更频繁地使用foreach

              【讨论】:

              • 我希望我能给出这些额外的点来解决循环类型的结构意义。谢谢!
              【解决方案10】:

              为了清楚起见,我是 for 循环。当我遇到一些不确定的情况时,我使用 while 循环

              【讨论】:

                【解决方案11】:

                在这种情况下这可能并不重要,但是编译器、VM 和 CPU 通常具有他们在后台使用的特殊优化技术,这将使 for 循环性能更好(并且在不久的将来并行),通常它们不会使用 while 循环来做到这一点(因为它更难确定它实际上将如何运行)。但在大多数情况下,代码清晰应该胜过优化。

                【讨论】:

                  【解决方案12】:

                  两者都很好,但请记住,有时直接访问 Iterator 很有用(例如,如果您要删除符合特定条件的元素 - 如果您在 for( T o : 集合)循环)。

                  我几乎总是更喜欢编写 for(blah : blah) [foreach] 语法,因为它对我来说似乎更自然易读。一般来说,迭代器的概念在编程之外并没有真正的相似之处

                  【讨论】:

                    【解决方案13】:

                    学术界倾向于使用 while 循环,因为它可以减少对程序的复杂推理。我更喜欢 for 或 foreach 循环结构,因为它们使代码更易于阅读。

                    【讨论】:

                      【解决方案14】:

                      恕我直言,如果您从英语的角度来看这段代码,则 for 循环在这种情况下的可读性较差。我正在编写一个作者滥用 for 循环的代码,它并不漂亮。比较以下:

                      for (; (currUserObjectIndex < _domainObjectReferences.Length) && (_domainObjectReferences[currUserObjectIndex].VisualIndex == index); ++currUserObjectIndex)
                          ++currNumUserObjects;
                      

                      对比

                      while (currUserObjectIndex < _domainObjectReferences.Length && _domainObjectReferences[currUserObjectIndex].VisualIndex == index)
                      {
                          ++currNumUserObjects;
                          ++currUserObjectIndex;
                      }
                      

                      【讨论】:

                        【解决方案15】:

                        使用 for 循环,您可以使用单个变量,因为它只为当前工作的 for 循环设置变量的范围。然而,这在 while 循环中是不可能的。 例如:
                        诠释我; for(i=0; in1;i++) 做点什么..

                        for(i=0;i n2;i+=2) 做点什么。

                        所以在第一个循环结束后 i=n1-1 。但是在使用第二个循环时,您可以将 i 再次设置为 0。 然而

                        int i=0;

                        while(i 小于限制) { 做某事 ..;我++; }

                        因此 i 在最后设置为 limit-1。所以你不能在另一个 while 循环中使用相同的 i。

                        【讨论】:

                          最近更新 更多