使用for循环还是for-each循环?

时间:2013-08-06 11:00:47

标签: java loops for-loop while-loop each

我们是否应该选择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());
}

使用的最佳口味是什么?

6 个答案:

答案 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。