为啥 for-each 循环适用于数组? (爪哇)

Posted

技术标签:

【中文标题】为啥 for-each 循环适用于数组? (爪哇)【英文标题】:Why do for-each loops work for arrays? (Java)为什么 for-each 循环适用于数组? (爪哇) 【发布时间】:2020-10-05 15:24:47 【问题描述】:

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

【问题讨论】:

【参考方案1】:

如果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);

【讨论】:

是否有任何来源描述了他们为何决定采用这种方式?特别是为什么他们决定 Array 不会实现 Iterable?我可以考虑一些原因,但我很好奇…… 您只是将某人的答案复制并粘贴为您自己的答案。相反,标记为重复。你甚至没有尝试改写它.. -1 感谢您的发言@VinceEmigh。我没有将其标记为重复,因为问题不同。我只是参加了对他有意义的部分。另外,我提到了实际的链接。我认为我没有做任何违反社区政策的事情。 #和平 @tquadrat Hera 是一些很好的答案,可能会对您有所启发。 ***.com/questions/1160081/… 你知道数组之外是否有任何数据结构可以在没有实现迭代的情况下用于每个循环?【参考方案2】:

根据JLS:

增强的 for 语句具有以下形式:

EnhancedForStatement: for ( VariableModifier UnannType VariableDeclaratorId : 表达式 ) 语句

EnhancedForStatementNoShortIf: for ( VariableModifier UnannType VariableDeclaratorId : 表达式 ) StatementNoShortIf

Java foreach 循环或增强的 for 语句被翻译成基本的 for 语句,如下:

    如果Expression 的类型是某个类型参数X 的Iterable&lt;X&gt; 的子类型,则令Ijava.util.Iterator&lt;X&gt;; 类型,否则令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

【讨论】:

以上是关于为啥 for-each 循环适用于数组? (爪哇)的主要内容,如果未能解决你的问题,请参考以下文章

Java中遍历Map的常用方法

Java学习笔记(for-each循环与数组的拷贝)

使用foreach打印多维数组[重复]

9 数组2 for-each 增强型循环

从字节码看Java中for-each循环(增强for循环)实现原理

如何将 for-each 循环应用于字符串中的每个字符?