迭代for循环或while循环?

我经常看到如下代码:

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

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

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

因为

  • 它更短
  • 它让i在一个更小的范围内
  • 它减less了混淆的机会。 ( i在外面用过吗? i在哪里申报?)

我认为代码应该尽可能简单理解,以便我只需要制作复杂的代码来完成复杂的事情。 你怎么看? 哪个更好?

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

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

对于while,for和foreach结构有适当的用法:

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

  • for – 如果正在循环,则使用此参数,而您的主要关注点是数组/集合/列表的索引。 如果你最有可能通过所有的元素,并按照特定的顺序(例如,通过sorting列表后退),那么使用for就更加有用。

  • foreach – 使用这个,如果你只需要通过你的collections,不pipe命令。

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

为什么不使用for-each构造? (我有一段时间没有使用Java,但是这存在于C#中,我很确定Java 1.5也有这个function):

 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”示例中,迭代器是在循环之外声明的,因此循环完成后它将继续存在。 这可能会导致问题,如果以后再次使用相同的迭代器。 例如, 在另一个循环中使用它之前,可能会忘记初始化它。

在“for”的例子中,迭代器是在循环中声明的,所以它的作用域限于循环。 如果你在循环之后尝试使用它,你会得到一个编译器错误。

如果只打算使用迭代器并抛弃它,则优先使用第二种forms; 否则你必须使用第一种forms

恕我直言,在这种情况下for循环是不太可读的,如果你从英语的angular度来看这个代码。 我正在编写一个代码,其中作者滥用循环,这是不漂亮的。 比较如下:

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

VS

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

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

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

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

使用for循环可以使用单个variables,因为它只为当前工作的循环设置variables的作用域。 然而这在while循环中是不可能的 。 例如:
int i; for(i = 0; in1; i ++)做某事

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

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

int i = 0;

while(i less than limit){do something ..; 我++; }

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

要么没事。 我用()我自己,我不知道是否有编译问题。 我怀疑他们都被优化到几乎相同的东西。

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

为了清楚,我是for循环。 当我面对一些不确定的条件时使用while循环

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

我更喜欢几乎所有的时候都写for(blah:blah)[foreach]语法,因为它对我来说似乎更自然。 一般来说,迭代器的概念在编程之外并不具有相似性

学术界倾向于selectwhile循环,因为它使得程序的复杂推理成为可能。 我倾向于更喜欢for-or foreach循环结构,因为它们使代码更容易阅读。

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

使用while()循环的每一行操作都less一些,这使得代码更容易让新的代码知道发生了什么。

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