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

16 浏览
0 Comments

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

这个问题已经有了答案

Java中的“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日
0
0 Comments

它们基本相同,但是for-each(第二个)有一定的限制

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

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

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

0
0 Comments

传统的循环

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的比分获胜。

只有在以下情况下才需要使用传统循环:

  • 需要元素的索引,或者
  • 需要修改列表
0