将Iterator向前移动到for语句和while语句之间的区别

当我使用对象的Iterator时,我使用while循环 (如每本书中学习Java,如Bruce Eckel的Thinking in Java ):

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

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

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

我不明白这个选择:

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

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

感谢您的每一个反馈

for循环的正确语法是:

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

(代码中的前面声明是多余的,以及for循环标题中的额外分号。)

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

 for (; ; ) { ; } 

这相当于:

 ; while () { ; ; } 

编辑:实际上, 如果 (在问题中)变量是用init语句声明的,那么上面两种forms并不完全等价。 在这种情况下,迭代器变量的范围会有所不同。 对于for循环,范围仅限于循环本身,在while循环的情况下,范围扩展到封闭块的末尾(没有什么大惊喜,因为声明在循环之外)。

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

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

可以写成:

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

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

它只是一种风格的东西,就像你在使用带索引的东西时我更喜欢for循环。 如果你正在使用Java 5,你当然应该在集合上使用foreach循环:

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

在for循环中声明Iterator的目的是最小化变量的范围 ,这是一种很好的做法。

当您在循环外部声明Iterator ,循环完成后引用仍然有效/有效。 99.99%的时间,一旦循环完成,你不需要继续使用Iterator ,所以这样的样式可能会导致这样的错误:

 //iterate over first collection Iterator it1 = collection1.iterator(); while(it1.hasNext()) { //blah blah } //iterate over second collection Iterator it2 = collection2.iterator(); while(it1.hasNext()) { //oops copy and paste error! it1 has no more elements at this point } 

这两种方法之间没有太大区别,除了第一种方法在循环之后记住it的值。 第二种方法可能会抛出错误,因为您在循环内重新声明了变量。

实际上还有第三种方法,以及。 而不是写作例如

 for (Iterator it = foo.iterator(); it.hasNext();) { SomeObject so = foo.next(); } 

你最常写的

 for (SomeObject so: foo) {...} 

这两个相同的东西……

人们可以使用显式(’旧样式’)循环,因为它对他们来说感觉更干净,也许他们还没有调整到新的语法(我个人认为它更清洁)。

循环结构的更长时间的一个实际特定优点是你有一个对迭代器的引用,因此可以在next()调用其他方法。 特别是, hasNext()通常可用于调用 – 想象一下,如果要打印出以逗号分隔的字符串列表:

 StringBuilder sb = new StringBuilder(); for (Iterator it=...; it.hasNext();){ sb.append(it.next()); if (it.hasNext()) sb.append(", "); } 

如果你使用更详细的for循环,它只是区分“这是最后一个”这样的情况。