为什么for-each循环对数组有效?(Java)

问题描述 投票:0回答:1

我不明白在Java中,for each循环如何能够迭代一个数组。我的理解是,for each循环可以迭代任何实现Iterable接口的类,但是Java中的数组并没有实现Iterable,那么for each循环怎么可能用在它们身上呢?

java arrays foreach iterable
1个回答
4
投票

如果右侧的 for (:) 习惯用语是一种 array 而非 Iterable 对象,内部代码使用一个 int 指数计数器并检查 array.length 来代替。这就是为什么它可以用来循环浏览数组的原因。请看 Java语言规范 以了解更多详情。

本回答的部分内容免于 此处. 你也可以看看这个问题。

我想补充的是,如果你想的话,你可以很容易地转换java的 arrayIterable:

Integer arr[] = { 1, 2, 3, 4, 5};

List<Integer> list = Arrays.asList(arr);
// or
Iterable<Integer> iterable = Arrays.asList(arr);

2
投票

根据 JLS:

增强型for语句的形式。

EnhancedForStatement: for ( {VariableModifier} UnannTypeVariableDeclaratorId : Expression ) 语句。

EnhancedForStatementNoShortIf: for ( {VariableModifier} UnannTypeVariableDeclaratorId : Expression ) StatementNoShortIf

Java foreach循环或增强型for语句转化为基本的for语句,如下。

  1. 如果类型为 ExpressionIterable<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
}
  1. 否则, Expression 必然有一个数组类型。T[].

增强的for报表相当于基本for报表的形式。

T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
    {VariableModifier} TargetType Identifier = #a[#i];
    Statement
}
© www.soinside.com 2019 - 2024. All rights reserved.