我经常看到如下代码:
Iterator i = list.iterator();
while(i.hasNext()) {
...
}
但我写的是(当Java 1.5不可用或者每个都不能使用时):
for(Iterator i = list.iterator(); i.hasNext(); ) {
...
}
,因为
i
保留在较小的范围内i
是否在{。}}之外使用
而? i
在哪里宣布?)我认为代码应该尽可能简单易懂,这样我才能制作复杂的代码来完成复杂的事情。你怎么看?哪个更好?
答案 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)
答案 13 :(得分:0)
两者都很好,但请记住,有时直接访问Iterator是有用的(例如,如果要删除符合特定条件的元素 - 如果在for(在)内部执行collection.remove(o),则会得到ConcurrentModificationException( T o:collection)loop)。
我更喜欢在几乎所有时间都编写for(blah:blah)[foreach]语法,因为它对我来说似乎更自然。迭代器的概念通常与编程之外没有相似之处
答案 14 :(得分:0)
学术界倾向于选择while循环,因为它对程序的推理不那么复杂。我倾向于选择for-或foreach-loop结构,因为它们使代码更容易阅读。