我想知道这些之间是否存在差异:
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();
}
如果没有任何差异哪一个更常见或更有效?
答案 0 :(得分:21)
for (int i = 0; i < list.size(); i++) {
list.get(i).doSomething();
}
RandomAccess
列表中有效
LinkedList
,get(i)
将必须迭代从head/tail
到i
List
,因为使用了List#get(int)
i = 0;
代替int i = 0;
- 将引用循环前声明的变量,循环外可能的副作用>
代替<
- 循环不会执行j++
代替i++
- 无限循环.get(j)
代替.get(i)
- 将始终获得相同的元素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(第二个)具有某些限制。
它可用于访问数组元素,但不能用于修改。
对于必须迭代的循环,可用 多个集合并行 - 例如,比较两个数组的元素。
它只能用于单个元素访问,不能用于比较数组中的连续元素。它是 仅向前 迭代器。如果您只想访问数组的几个元素,则需要使用传统的for循环。
答案 2 :(得分:1)
第二个适用于所有类型(可能无序)Iterable,因为它不依赖于随机访问,即get(i)
。
答案 3 :(得分:1)
for(:)
语句是只读循环。您无法在此循环中更改集合。此外,您不能使用多个元素。
传统的for
声明并没有这样的限制。