代码之家  ›  专栏  ›  技术社区  ›  James A. N. Stauffer

用for循环还是while循环迭代?

  •  45
  • James A. N. Stauffer  · 技术社区  · 17 年前

    我经常看到这样的代码:

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

    但我这样写(当Java 1.5不可用或无法使用时):

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

    因为

    • 它更短
    • 它保持 i 在较小的范围内
    • 它减少了混淆的机会。(Is 在外面使用 同时?在哪里 宣布?)

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

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

    15 回复  |  直到 10 年前
        1
  •  81
  •   Lou Franco    17 年前

    我更喜欢for循环,因为它还将迭代器的作用域设置为for循环。

        2
  •  10
  •   Jon Limjap    17 年前

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

    • while -如果您正在迭代,并且循环与否的决定因素仅基于一个条件,请使用此选项。在这种循环构造中,保持索引只是次要问题;一切都应该以条件为基础

    • for -如果您正在循环,并且主要关注数组/集合/列表的索引,请使用此选项。如果你最有可能通过,使用for会更有用 所有 无论如何,元素都是按照特定的顺序排列的(例如,在排序列表中倒退)。

    • foreach -如果你只需要浏览你的收藏,无论顺序如何,都可以使用这个。

    显然,上述情况也有例外,但这是我决定使用哪种情况时使用的一般规则。话虽如此,我倾向于使用 循环 更经常。

        3
  •  6
  •   reevesy onejigtwojig    13 年前

    为什么不为每个构造使用?(我有一段时间没有使用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));
    
        4
  •  4
  •   Dima    17 年前

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

    在“while”示例中,迭代器在循环外声明,因此循环结束后它将继续存在。如果稍后再次使用此迭代器,则可能会导致问题。例如,在将其用于另一个循环之前,您可能会忘记初始化它。

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

        5
  •  2
  •   Steven A. Lowe    17 年前

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

        6
  •  2
  •   Igor Vaschuk    14 年前

    依我之见 如果你从英语语言的角度来看这段代码,在这种情况下循环的可读性会降低。我正在编写一个代码,其中作者会滥用 循环,而且不漂亮。比较以下内容:

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

    兽医

    while (currUserObjectIndex < _domainObjectReferences.Length && _domainObjectReferences[currUserObjectIndex].VisualIndex == index)
    {
        ++currNumUserObjects;
        ++currUserObjectIndex;
    }
    
        7
  •  1
  •   Guy Starbuck    17 年前

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

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

        8
  •  1
  •   Robert Gould    17 年前

    在这种情况下,这可能并不重要,但编译器、虚拟机和CPU通常都有特殊的优化技术,可以提高for循环的性能(在不久的将来是并行的),一般来说,它们不会对while循环这样做(因为很难确定它实际将如何运行)。但在大多数情况下,代码清晰度应该胜过优化。

        9
  •  1
  •   Abhishek Kaushik    12 年前

    使用for循环,您可以使用单个变量,因为它仅为当前的for循环设置变量的范围。然而,在while循环中这是不可能的 . 例如:
    int i;for(i=0;in1;i++)做某事。。

    for(i=0;in2;i+=2)做某事。

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

    int i=0;

    while(i小于limit){做某事…;i++;}

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

        10
  •  0
  •   scubabbl    17 年前

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

        11
  •  0
  •   Svet    17 年前

    我同意应该尽可能使用for循环,但有时在循环体中控制迭代器的逻辑更复杂。那样的话,你必须暂时离开。

        12
  •  0
  •   jehanzeb.naeem.khan    17 年前

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

        13
  •  0
  •   Mat Mannion    17 年前

    两者都很好,但请记住,有时直接访问迭代器是有用的(例如,如果你要删除与特定条件匹配的元素,如果你在for(to:collection)循环中执行collection.remove(o),你会得到ConcurrentModificationException)。

    我几乎一直都喜欢写for(blah:blah)[foreach]语法,因为它对我来说似乎更自然可读。迭代器的概念通常在编程之外没有相似之处

        14
  •  0
  •   James Muscat    17 年前

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

        15
  •  0
  •   Tim Cooper    14 年前

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

    while()循环的每一行上发生的操作更少,使代码新手更容易理解代码中发生的事情。

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