用for循环或while循环迭代?

时间:2008-09-19 03:06:18

标签: java for-loop iterator

我经常看到如下代码:

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

15 个答案:

答案 0 :(得分:81)

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

答案 1 :(得分:10)

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

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

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

  • foreach - 如果您只是需要通过收集而无论订单如何,请使用此选项。

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

答案 2 :(得分:6)

为什么不使用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));

答案 3 :(得分:4)

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

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

在“for”示例中,迭代器在循环内声明,因此其范围仅限于循环。如果在循环之后尝试使用它,则会出现编译器错误。

答案 4 :(得分:2)

如果你只想使用迭代器一次并扔掉它,那么第二种形式是首选;否则你必须使用第一个表格

答案 5 :(得分:2)

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

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

vs

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

并非在这种情况下它可能很重要,但编译器,虚拟机和CPU通常都有特殊的优化技术,它们可以使用更好的循环性能(并且在不久的将来并行),通常它们不会使用while循环执行此操作(因为它更难确定它实际上将如何运行)。但在大多数情况下,代码清晰度应该胜过优化。

答案 8 :(得分:1)

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

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

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

int i = 0;

while(我不到限制){做某事......;我++; }

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

答案 9 :(得分:0)

要么是好的。我自己使用(),我不知道是否存在编译问题。我怀疑它们都被优化到几乎相同的东西。

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

两者都很好,但请记住,有时直接访问Iterator是有用的(例如,如果要删除符合特定条件的元素 - 如果在for(在)内部执行collection.remove(o),则会得到ConcurrentModificationException( T o:collection)loop)。

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

答案 14 :(得分:0)

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