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