3

我们应该更喜欢 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());
}

用什么味道最好?

4

6 回答 6

2

循环 1、3 和 4 本质上是相同的,并且可能编译为相同的字节码。所以使用第一个更具可读性的。

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

于 2013-08-06T11:07:02.500 回答
2

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

情况1:

//for-each loop
for(String name: names){
    log(name);
}

有利:

  • 当你想迭代集合时
  • 没有添加或删除数组。
  • 不需要您迭代的项目的索引

案例二:

//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());
}

有利:

  • 当你想迭代集合时
  • 迭代时添加或删除需要||ly。
于 2013-08-06T11:08:09.270 回答
2

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

于 2013-08-06T11:09:10.147 回答
1

foreach当您想删除此循环内的某些元素时,请勿使用循环。而是使用经典for循环,当您可以在从集合中删除元素后减少迭代器时。

于 2013-08-06T11:08:05.437 回答
0

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

有关此的更多详细信息,请参阅

http://forums.asp.net/t/1209455.aspx/1
于 2013-08-06T11:08:00.463 回答
0

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

于 2013-08-06T11:08:09.167 回答