使用 for 语句向前移动迭代器和 while 语句之间的区别

2022-09-03 08:33:07

当我使用对象的迭代器时,我使用一个 while 循环(就像每本学习 Java 的书中所写的那样,如 Bruce Eckel 的 Thinking in Java):

Iterator it=...

while(it.hasNext()){
    //...
}

但有时我看到比有人使用for循环

Iterator it=...
for (Iterator it=...; it.hasNext();){
    //...
}

我不明白这个选择:

  • 当我有一个具有序号序列(作为数组)或具有步骤的特殊规则(通常声明为简单增量)的集合时,我使用for循环counter++
  • 当循环结束时,我使用 while 循环,我没有这个约束,而只是一个退出的逻辑条件。

这是一个没有其他原因的样式编码问题,或者它存在一些我不知道的其他逻辑(例如性能)?

感谢您的每一次反馈


答案 1

for 循环的正确语法是:

for (Iterator it = ...; it.hasNext(); ){
    //...
}

(代码中的上述声明是多余的,for 循环标题中的额外分号也是多余的。

无论你是使用这种语法还是循环都是一个品味问题,两者翻译为完全相同。for 循环的通用语法是:while

for (<init stmt>; <loop cond>; <iterate stmt>) { <body>; }

这相当于:

<init stmt>;
while (<loop cond>) { <body>; <iterate stmt>; }

编辑:实际上,如果(如问题中所示)变量是用 init 语句声明的,则上述两种形式并不完全等价。在这种情况下,迭代器变量的作用域将存在差异。对于 for 循环,范围仅限于循环本身,但是,在 while 循环的情况下,范围扩展到封闭块的末尾(没有大惊讶,因为声明在循环之外)。

此外,正如其他人所指出的,在较新版本的Java中,for循环有一个速记符号:

for (Iterator<Foo> it = myIterable.iterator(); it.hasNext(); ) {
    Foo foo = it.next();
    //...
}

可以写成:

for (Foo foo : myIterable) {
    //...
}

使用此窗体,您当然会丢失对迭代器的直接引用,这是必需的,例如,如果要在迭代时从集合中删除项。


答案 2

这只是一个风格的东西,像你一样,我更喜欢在使用带有索引的东西时的for循环。如果您使用的是Java 5,那么您当然应该在集合上使用foreach循环:

Collection<String> someCollection = someCollectionOfString();
for (String element : someCollection) {
....
}