传统循环和for-each循环之间有什么区别?

时间:2015-11-07 11:11:42

标签: java

我想知道这些之间是否存在差异:

ArrayList<Example> list = new ArrayList<Example>

1 - )

for(int i = 0; i < list.size(); i++) {
    list.get(i).doSomething();
}

2 - )

for(Example example : list) {
    example.doSomething();
}

如果没有任何差异哪一个更常见或更有效?

4 个答案:

答案 0 :(得分:21)

传统循环

for (int i = 0; i < list.size(); i++) {
    list.get(i).doSomething();
}
  • 允许修改列表,例如:
    • 您可以在列表末尾添加额外元素,也可以通过
    • 进行迭代
  • 你知道索引
    • 可用于引用另一个相同大小的列表
    • 可用于指代上一个/下一个元素
  • 仅在RandomAccess列表中有效
    • 如果在循环的每次迭代中LinkedListget(i)将必须迭代从head/taili
    • 的所有元素
  • 仅适用于List,因为使用了List#get(int)
  • 容易出错,很多事情都可能出错,例如:
    • i = 0;代替int i = 0; - 将引用循环前声明的变量,循环外可能的副作用
    • >代替< - 循环不会执行
    • j++代替i++ - 无限循环
    • .get(j)代替.get(i) - 将始终获得相同的元素

For-each循环

for (Example example : list) {
    example.doSomething();
}
  • 不允许修改列表
    • 尝试这样做很可能会导致ConcurrentModificationException
  • 你不知道元素的索引
    • 你不能引用上一个/下一个元素
  • 在所有情况下都有效,因为使用了特定于集合的Iterator
    • 有效LinkedList
  • 不仅适用于每个Collection,还适用于Iterable,因为Iterable#iterator()使用List
    • 您可以轻松地将Set替换为Iterable - 无需更改所需的循环
    • 您可以轻松替换自己的课程,只需实施for-each
    • 即可
  • 更强大(代码更少,特殊字符更少)

摘要

PS> Install-Package NamedPipeWrapper 循环以3:2的比分获胜。

使用传统循环的唯一原因是:

  • 元素的索引是必需的,或
  • 列表必须修改

答案 1 :(得分:3)

它们基本相同,但for-each(第二个)具有某些限制

  1. 它可用于访问数组元素,但不能用于修改

  2. 对于必须迭代的循环,可用 多个集合并行 - 例如,比较两个数组的元素。

  3. 它只能用于单个元素访问,不能用于比较数组中的连续元素。它是 仅向前 迭代器。如果您只想访问数组的几个元素,则需要使用传统的for循环。

答案 2 :(得分:1)

第二个适用于所有类型(可能无序)Iterable,因为它不依赖于随机访问,即get(i)

答案 3 :(得分:1)

for(:)语句是只读循环。您无法在此循环中更改集合。此外,您不能使用多个元素。

传统的for声明并没有这样的限制。