迭代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的构造也允许我在一个共同的位置(在方法的顶部)对初始化进行分组,这也简化了对我的评论,并为有人第一次阅读它的概念化。