2

考虑以下简单代码

    String[] strArray = new String[10];
    for(String s : strArray) {
        System.out.println(s);
    }

据我所知,for-each 结构喜欢for(String s : strArray)在内部使用 Iterator 来迭代元素。遍历数组时是否相同?

如果是,那么为什么我们不能执行以下操作

Iterable<String> strIterator = strArray.iterator();//illegal
4

2 回答 2

2

据我所知,像 for(String s : strArray) 这样的 for-each 结构在内部使用一个迭代器来迭代元素。

好吧,它何时strArray是可迭代的 - 它对数组的工作方式不同。

所有详细信息都在JLS 的第 14.14.2 节中。尤其是:

否则,表达式必须具有数组类型,T[]

L1...Lm是紧接在增强的 for 语句之前的(可能为空的)标签序列。

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

T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
   VariableModifiersopt TargetType Identifier = #a[#i];
   Statement
}

#a和 #i是自动生成的标识符,与增强 for 语句发生时范围内的任何其他标识符(自动生成或以其他方式)不同。

TargetType 是循环变量的类型,由出现在 FormalParameter 中的 Type 表示,后跟 FormalParameter 中标识符后面的任何括号对(第 10.2 节)。

换句话说 - 当您遍历一个数组时,它只是使用该length字段,就好像您手动编写它一样。

于 2013-08-29T11:09:55.903 回答
0

它只是在所有数组上使用一个 forloop,但是正如你所说的迭代器在所有可迭代的东西上。

这是一个方便的 JLS 怪癖

于 2013-08-29T11:18:34.557 回答