【发布时间】:2020-12-15 07:10:22
【问题描述】:
我正在学习内部迭代器,并且我了解内部迭代器在后台管理迭代:
public void internalIterator(){
List<String> namesList = Arrays.asList("Tom", "Dick", "Harry");
namesList.forEach(name -> System.out.println(name));
}
但我认为增强的 for 循环做同样的事情:
public void enhancedForLoop(){
List<String> namesList = Arrays.asList("Tom", "Dick", "Harry");
for(String name : namesList){
System.out.println(name);
}
}
我知道增强的 for 循环在后台使用 hasNext() 和 next() 方法。并且增强的 for 循环是一个外部迭代器。那么为什么 forEach() 方法是一个内部迭代器呢? forEach() 方法不是在后台使用 hasNext() 和 next() 方法吗?如何以不同于增强的 for 循环的方式在 backgorund 中管理迭代?使用 forEach() 的迭代是否比使用增强的 for 循环更快?任何反馈将不胜感激?
【问题讨论】:
-
forEach的实现取决于集合的类型。例如,ArrayList使用标准索引循环。LinkedList继承了Iterable的默认实现,它使用了增强的 for 循环。增强的 for 循环使用迭代器来遍历集合,所以答案是:这取决于你使用的集合。 -
@Dioxin 你有“ArrayList 使用标准索引循环”的来源吗? for-each 循环的最终操作数必须是 Iterable,这意味着始终使用 Iterable.iterator()。
-
@VGR 关于“for-each 循环的最终操作数必须是 Iterable”,您想说什么?哪个最终操作数具有 for-each 循环?你有链接吗?谢谢!
-
@VGR 可以查看源代码。这是 OpenJDK 的
ArrayList#forEach的链接:github.com/openjdk/jdk/blob/master/src/java.base/share/classes/… -
@VGR
iterator()并不总是使用。引入forEach背后的目标之一是允许特定于实现的迭代。ArrayList仍然是Iterable。但是开发人员认为使用索引循环而不是列表的迭代器更为优化。ArrayDeque还提供了它自己的forEach实现,它不使用iterator()。至于增强循环,Iterable只是一项要求(JLS 14.14.2);在增强循环中使用数组时,它会转换为索引循环。
标签: java loops foreach iterator