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

迭代for循环还是while循环?

  •  40
  • James A. N. Stauffer  · 技术社区  · 16 年前

    我经常看到这样的代码:

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

    但是我写的是(当Java 1.5不可用或者不能使用每个)时:

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

    因为

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

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

    来自: http://jamesjava.blogspot.com/2006/04/iterating.html

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

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

        2
  •  10
  •   Jon Limjap    16 年前

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

    • while -如果正在迭代,而循环的决定因素是否仅基于某个条件,则使用此选项。在这个循环结构中,保持索引只是次要的问题;所有事情都应该基于条件

    • for -如果您正在循环,并且主要关注的是数组/集合/列表的索引,请使用此选项。如果你最有可能通过的话,使用for会更有用。 全部的 不管怎样,元素都以特定的顺序(例如,通过排序的列表向后移动)。

    • foreach -如果您只需要浏览您的收藏,而不考虑订单,请使用此功能。

    显然,上面有例外,但这是我在决定使用哪一个时使用的一般规则。据说我倾向于使用 前额 更经常。

        3
  •  6
  •   reevesy onejigtwojig    12 年前

    为什么不为每个构造使用?(我在一段时间内还没有使用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    16 年前

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

    在“while”示例中,迭代器在循环外部声明,因此循环完成后它将继续存在。如果在以后某个时候再次使用相同的迭代器,这可能会导致问题。在另一个循环中使用它之前,您可能会忘记初始化它。

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

        5
  •  2
  •   Steven A. Lowe    16 年前

    如果只使用一次迭代器并丢弃它,则首选第二个窗体;否则必须使用第一个窗体

        6
  •  2
  •   Igor Vaschuk    13 年前

    伊莫尔 对于 如果从英语的角度来看这个代码,那么在这个场景中循环的可读性会降低。我正在写一个作者滥用的代码 对于 循环,而且不漂亮。比较以下内容:

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

    VS

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

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

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

        8
  •  1
  •   Robert Gould    16 年前

    在这种情况下,这可能并不重要,但编译器、虚拟机和CPU通常都有一些特殊的优化技术,这些技术是他们在后台使用的,可以使循环性能更好(在不久的将来并行运行),一般来说,它们不使用while循环(因为很难确定它的实际运行方式)。但在大多数情况下,代码清晰性应该胜过优化。

        9
  •  1
  •   Abhishek Kaushik    11 年前

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

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

    所以在第1个循环之后,末端的i=n1-1。但当使用第二个循环时,您可以再次将i设置为0。 然而

    int i=0;

    当(我低于极限)做点什么..;我++;

    因此,我在结尾处设置为极限-1。所以你不能在另一个while循环中使用相同的i。

        10
  •  0
  •   scubabbl    16 年前

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

        11
  •  0
  •   Svet    16 年前

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

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

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

        13
  •  0
  •   Mat Mannion    16 年前

    这两种方法都很好,但请记住,有时直接访问迭代器很有用(例如,如果要删除符合某个条件的元素,则在执行collection.remove(o)for(t o:collection)循环中会得到ConcurrentModificationException)。

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

        14
  •  0
  •   James Muscat    16 年前

    学术界倾向于选择while循环,因为它使得程序的推理不那么复杂。我倾向于使用for或foreach循环结构,因为它们使代码更容易阅读。

        15
  •  0
  •   Tim Cooper    13 年前

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

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

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