传统循环和 for-each 循环之间有什么区别?
传统循环和 for-each 循环之间有什么区别?
这个问题已经有了答案:
我想知道这两者之间有什么区别:
ArrayList list = new ArrayList
1-)
for(int i = 0; i < list.size(); i++) { list.get(i).doSomething(); }
2-)
for(Example example : list) { example.doSomething(); }
如果没有任何区别,那么哪一个更常见或更有效?
admin 更改状态以发布 2023年5月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-each 循环
for (Example example : list) { example.doSomething(); }
- 不允许修改列表
- 尝试这样做很可能会导致
ConcurrentModificationException
- 尝试这样做很可能会导致
- 您不知道元素的索引
- 您无法引用前一个/后一个元素
- 在所有情况下都是高效的,因为使用特定于集合的
Iterator
- 对于
LinkedList
的情况高效
- 对于
- 不仅适用于每个
Collection
,还适用于每个Iterable
,因为使用Iterable#iterator()
- 可以轻松用
Set
替换List
- 不需要更改循环 - 可以轻松替换为您自己的类,它只需要实现
Iterable
- 可以轻松用
- 更强大(代码更少,特殊字符更少)
概要
for-each
循环以3:2的比分获胜。
只有在以下情况下才需要使用传统循环:
- 需要元素的索引,或者
- 需要修改列表