我们是否应该选择for-each循环而不是传统的for循环? while循环是否有利?
List<String> names = Arrays.asList("John", "Jeff", "Mary", "Elise");
//for-each loop
for(String name: names){
log(name);
}
//traditional for-loop
for(int index=0; index < 10; ++index){
log(names.get(index));
}
//Iterator while
Iterator<String> iter1 = names.iterator();
while (iter1.hasNext()) {
log(iter1.next());
}
//Iterator for loop
for(Iterator<String> iter2 = names.iterator(); iter2.hasNext();){
log(iter2.next());
}
使用的最佳口味是什么?
答案 0 :(得分:2)
循环1,3和4基本相同,可能编译为相同的字节码。所以使用第一个更易读的。
如果您不知道要处理的列表实现,应该避免使用循环2。特别是,list.get(i)
可以是某些列表上的O(n)操作(例如LinkedLists),使得循环2的性能为O(n ^ 2)操作=坏。
答案 1 :(得分:2)
选项1只是3和4的缩短版本。其中#1是首选,因为它更容易编写和读取。选项2在微观性能方面可能更好,因为它不会创建Iterator对象,但仅在您使用像ArrayList这样的RandomAccess列表的情况下
答案 2 :(得分:1)
如果要删除此循环中的某些元素,请不要使用foreach
循环。相反,使用经典的for
循环,可以在从集合中删除元素后减少迭代器。
答案 3 :(得分:1)
是一样的。但有些情况比其他情况更有利
案例1:
//for-each loop
for(String name: names){
log(name);
}
有利:
案例2:
//traditional for-loop
for(int index=0; index < 10; ++index){
log(names.get(index));
}
有利:
案例3:
Iterator<String> iter1 = names.iterator();
while (iter1.hasNext()) {
log(iter1.next());
}
和
//Iterator for loop
for(Iterator<String> iter2 = names.iterator(); iter2.hasNext();){
log(iter2.next());
}
有利:
答案 4 :(得分:0)
For和foreach在性能上略有不同。它们的速度大致相同。但是foreach循环为局部变量使用了更多的堆栈空间。
有关此问题的更多详情,请参阅
http://forums.asp.net/t/1209455.aspx/1
答案 5 :(得分:0)
只要容器实现Iterable,使用for each
,只要上面提到你就不需要索引。 Altought概率地,您将使用Objects id字段而不是id。