【发布时间】:2020-10-05 15:24:47
【问题描述】:
我不明白 for each 循环如何遍历 Java 中的数组。我的理解是 for each 循环可以迭代任何实现 Iterable 接口的类,但是 Java 中的数组不实现 Iterable,那么 for each 循环怎么可能在它们上使用呢?
【问题讨论】:
标签: java arrays foreach iterable
我不明白 for each 循环如何遍历 Java 中的数组。我的理解是 for each 循环可以迭代任何实现 Iterable 接口的类,但是 Java 中的数组不实现 Iterable,那么 for each 循环怎么可能在它们上使用呢?
【问题讨论】:
标签: java arrays foreach iterable
如果for (:) 惯用语的右侧是array 而不是Iterable 对象,则内部代码使用int 索引计数器并检查array.length。这就是为什么它可以用来循环遍历数组。有关详细信息,请参阅Java Language Specification。
这个答案的一部分被here 豁免。你也可以看看那个问题。
我想补充一下,如果您愿意,您可以轻松地将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} UnannType VariableDeclaratorId : 表达式 ) 语句
EnhancedForStatementNoShortIf: for ( {VariableModifier} UnannType VariableDeclaratorId : 表达式 ) StatementNoShortIf
Java foreach 循环或增强的 for 语句被翻译成基本的 for 语句,如下:
Expression 的类型是某个类型参数X 的Iterable<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
}
【讨论】: