我不明白在Java中,for each循环如何能够迭代一个数组。我的理解是,for each循环可以迭代任何实现Iterable接口的类,但是Java中的数组并没有实现Iterable,那么for each循环怎么可能用在它们身上呢?
如果右侧的 for (:)
习惯用语是一种 array
而非 Iterable
对象,内部代码使用一个 int
指数计数器并检查 array.length
来代替。这就是为什么它可以用来循环浏览数组的原因。请看 Java语言规范 以了解更多详情。
本回答的部分内容免于 此处. 你也可以看看这个问题。
我想补充的是,如果你想的话,你可以很容易地转换java的 array
到 Iterable
:
Integer arr[] = { 1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(arr);
// or
Iterable<Integer> iterable = Arrays.asList(arr);
根据 JLS:
增强型for语句的形式。
EnhancedForStatement: for ( {VariableModifier} UnannTypeVariableDeclaratorId : Expression ) 语句。
EnhancedForStatementNoShortIf: for ( {VariableModifier} UnannTypeVariableDeclaratorId : Expression ) StatementNoShortIf
Java foreach循环或增强型for语句转化为基本的for语句,如下。
Expression
是 Iterable<X>
对于一些类型参数X,那么让 I
是那种 java.util.Iterator<X>;
否则,就让 I
是原始类型 java.util.Iterator.
增强的for语句相当于基本for语句的形式。
for (I #i = Expression.iterator(); #i.hasNext(); ) {
{VariableModifier} TargetType Identifier =
(TargetType) #i.next();
Statement
}
Expression
必然有一个数组类型。T[]
.增强的for报表相当于基本for报表的形式。
T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
{VariableModifier} TargetType Identifier = #a[#i];
Statement
}