-2

考虑ArrayList<String> list以下示例的 an。

我很好奇 for-each 循环是如何“在幕后”工作的。传统的 for 循环通过数字索引访问列表的元素,如下所示:

for(int i = 0; i < list.size(); i++)

for-each 语法是否以本质上不同的方式访问列表的元素?或者它只是同一事物的简写版本?

例如,在以下循环中,是否隐式创建了一个变量(i如上)?如果有,它有名字吗?如果不是,列表的元素是否仍按顺序访问?

for(String item : list)
4

3 回答 3

2

增强的 for 循环是使用迭代器实现的基本 for 循环。

请参阅JLS - 第 14.14 节

增强 for 语句的含义通过翻译成基本的 for 语句给出,如下:

  • 如果 Expression 的类型是 的子类型Iterable,则翻译如下。

    如果 Expression 的类型是Iterable<X>某个类型参数 X 的子类型,则令 I 为 type java.util.Iterator<X>;否则,让我成为原始类型java.util.Iterator

增强的 for 语句等效于以下形式的基本 for 语句:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    VariableModifiersopt TargetType Identifier =
        (TargetType) #i.next();
    Statement
}
于 2013-07-05T22:17:57.593 回答
1

增强的 for 循环是基于迭代器访问列表的快速方法,而不是基于索引。它是这样工作的:

Iterator<String> itr = list.iterator();
while(itr.hasNext()) {
  String item = itr.next():
  //your code
}
于 2013-07-05T22:16:37.920 回答
1

iterator在幕后使用,而不是传统的索引

for(String name: names){
}

相当于

for (Iterator<String> i = names.iterator(); i.hasNext();){

}

另见

于 2013-07-05T22:15:41.700 回答