为什么for-each循环适用于数组?(Java)

3

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

2个回答

4
如果 for(:) 结构的右侧是一个数组而不是一个 Iterable 对象,那么内部代码将使用 int 索引计数器,并检查其是否小于数组的长度(array.length),因此它可以用来循环遍历数组。有关详细信息,请参见 Java 语言规范。这是链接:https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14.2
该回答的一部分来自这里。你也可以查看该问题。
我想补充一下,如果需要,你可以很容易地将 Java 数组转换为 Iterable 对象。
Integer arr[] = { 1, 2, 3, 4, 5};

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

有没有任何来源描述他们为什么决定采取这种方式?特别是为什么他们决定Array不实现Iterable?我可以想到一些原因,但我很好奇... - tquadrat
你只是把别人的答案复制粘贴成为自己的。相反,应该标记为重复。你甚至没有试图重新表述它。-1 - Dioxin
感谢@VinceEmigh的回复。我没有将其标记为重复,因为这些问题是不同的。我只是摘取了对他有意义的部分。此外,我已经提到了实际链接。我认为我没有违反社区政策。#和平 - Plabon Dutta
@tquadrat 这里有一些很好的答案,可能会让你有所启发。https://dev59.com/L3M_5IYBdhLWcg3w8IHR - Plabon Dutta
你知道除了数组以外,有哪些数据结构可以在 for each 循环中使用而不需要实现可迭代协议吗? - timg
目前我想不到什么。问题是,Java 中大多数著名的数据结构(除了 Map)都扩展了 Collection 接口,而 Collection 接口又扩展了 Iterable 接口。因此,在 for-each 循环中使用除数组之外的数据结构选项并不多。 - Plabon Dutta

2
根据JLS
增强型for语句的形式如下:
EnhancedForStatement:for({VariableModifier} UnannType VariableDeclaratorId:Expression)Statement
EnhancedForStatementNoShortIf:for({VariableModifier} UnannType VariableDeclaratorId:Expression)StatementNoShortIf
Java中的foreach循环或增强型for语句被转换为基本的for语句,如下所示:
如果Expression的类型是X的Iterable子类型,则让I成为java.util.Iterator类型;否则,让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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接