当我使用对象的Iterator时,我使用while循环(如每本书中学习Java,如Bruce Eckel的Thinking in Java):
Iterator it=... while(it.hasNext()){ //... }
但有时我看到的是有人使用for循环:
Iterator it=... for (Iterator it=...; it.hasNext();){ //... }
我不明白这个选择:
当我有一个带有序数序列的集合(作为数组)或者有一个特殊的步骤规则(通常声明为一个简单的增量)时,我使用for循环counter++
.
我在循环结束时使用while循环,我没有这个约束,但只有退出的逻辑条件.
这是一个没有其他原因的样式编码问题,或者存在一些我不知道的其他逻辑(例如性能)?
感谢您的每一个反馈
for循环的正确语法是:
for (Iterator it = ...; it.hasNext(); ){ //... }
(代码中的前面声明是多余的,以及for循环标题中的额外分号.)
无论你使用这种语法还是while
循环是一个品味问题,两者都转化为完全相同.for循环的通用语法是:
for (; ; ) { ; }
这相当于:
; while ( ) { ; ; }
编辑:实际上,如果(如问题中)变量是用init语句声明的,那么上述两种形式并不完全等效.在这种情况下,迭代器变量的范围会有所不同.对于for循环,范围仅限于循环本身,在while循环的情况下,范围扩展到封闭块的末尾(没有什么大惊喜,因为声明在循环之外).
另外,正如其他人所指出的,在较新版本的Java中,for循环有一个简写符号:
for (Iteratorit = myIterable.iterator(); it.hasNext(); ) { Foo foo = it.next(); //... }
可以写成:
for (Foo foo : myIterable) { //... }
使用此表单时,您当然会失去对迭代器的直接引用,这是必要的,例如,如果要在迭代时从集合中删除项目.
它只是一种风格的东西,就像你在使用带索引的东西时我更喜欢for循环.如果你正在使用Java 5,你当然应该在集合上使用foreach循环:
CollectionsomeCollection = someCollectionOfString(); for (String element : someCollection) { .... }
声明Iterator
for循环的目的是最小化变量的范围,这是一个很好的做法.
当您声明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 }