42

我经常看到这样的代码:

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

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

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

因为

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

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

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

4

15 回答 15

83

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

于 2008-09-19T03:07:42.993 回答
12

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

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

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

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

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

于 2008-09-19T03:20:00.170 回答
5

为什么不使用 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));
于 2008-09-19T03:09:39.540 回答
4

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

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

在“for”示例中,迭代器是在循环内部声明的,因此它的范围仅限于循环。如果您尝试在循环后使用它,您将收到编译器错误。

于 2008-09-19T03:13:23.603 回答
2

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

于 2008-09-19T03:08:30.620 回答
2

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

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

对比

while (currUserObjectIndex < _domainObjectReferences.Length && _domainObjectReferences[currUserObjectIndex].VisualIndex == index)
{
    ++currNumUserObjects;
    ++currUserObjectIndex;
}
于 2011-12-08T18:24:05.600 回答
1

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

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

于 2008-09-19T03:10:27.933 回答
1

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

于 2008-09-19T03:30:25.950 回答
1

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

for(i=0;i n2;i+=2) 做一些事情。

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

诠释我=0;

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

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

于 2014-01-06T14:29:17.167 回答
0

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

于 2008-09-19T03:07:42.773 回答
0

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

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

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

于 2008-09-19T03:13:47.783 回答
0

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

于 2008-09-19T03:15:47.123 回答
0

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

于 2008-09-19T03:24:37.057 回答
0

两者都很好,但请记住,有时直接访问 Iterator 很有用(例如,如果您要删除符合特定条件的元素 - 如果您在 for(T o 中执行 collection.remove(o) 操作,则会收到 ConcurrentModificationException :集合)循环)。

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

于 2008-09-19T11:51:03.677 回答
0

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

于 2008-09-19T12:02:35.430 回答