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

我们应该更喜欢for-each循环而不是传统的for循环吗? while循环是否有利?

List 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 iter1 = names.iterator(); while (iter1.hasNext()) { log(iter1.next()); } //Iterator for loop for(Iterator iter2 = names.iterator(); iter2.hasNext();){ log(iter2.next()); } 

什么是最好的味道?

是一样的。 但有些情况比其他情况更有利

情况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 iter1 = names.iterator(); while (iter1.hasNext()) { log(iter1.next()); } 

 //Iterator for loop for(Iterator iter2 = names.iterator(); iter2.hasNext();){ log(iter2.next()); } 

有利的:

  • 当你想迭代收集
  • 迭代时加法或删除。

循环1,3和4基本相同,可能编译为相同的字节码。 所以使用第一个更易读的。

如果您不知道要处理的列表实现,应该避免使用循环2。 特别地, list.get(i)可以是某些列表上的O(n)操作(例如LinkedLists),使得循环2的性能为O(n ^ 2)操作=坏。

选项1只是3和4的缩短版本。其中#1是优选的,因为它更容易编写和读取。 选项2在微观性能方面可能更好,因为它不会创建Iterator对象,但仅在您使用像ArrayList这样的RandomAccess列表的情况下

如果要删除此循环中的某些元素,请不要使用foreach循环。 相反,使用经典的for循环,当你从集合中删除元素后可以减少迭代器。

因为和foreach在性能上略有不同。 它们的速度大致相同。 但是foreach循环使用更多的堆栈空间用于局部变量。

有关此问题的更多详情,请参阅

 http://forums.asp.net/t/1209455.aspx/1 

只要容器实现Iterable,就可以使用for each ,只要上面提到你就不需要索引。 Altought概率地,您将使用Objects id字段而不是id。