我经常看到这样的代码:

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/iteating.html

有帮助吗?

解决方案

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

其他提示

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

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

  • for - 如果您正在循环并且您主要关心的是数组/集合/列表的索引,请使用此选项。如果您最有可能经历以下情况,则使用 for 会更有用 全部 无论如何,并且以特定顺序(例如,向后浏览排序列表)。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

整数i=0;

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

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

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

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

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top