奇怪的Java for-each循环

3
有人能告诉我,它为什么有效吗?
int[] ints = {1,2,3};
for(int i : ints) {
System.out.println(i); i = 0;
}

为什么我可以将i设置为0,但它仍然进行迭代?

1
为什么你不能将i设置为0?由于它是按值传递而不是引用,因此i被设置为0,但对于整数没有任何变化。 - Worthless
1
尝试在代码的不同部分打印i的值。 - Andreas
3个回答

8

由于在该循环中i不是控制变量,而只是数组中的一个值。 根据JLS§14.4.2,对于数组,增强型for循环等效于以下代码:

The enhanced for statement is equivalent to a basic for statement of the form:

...

for (int #i = 0; #i < #a.length; #i++) {
    {VariableModifier} TargetType Identifier = #a[#i];
    Statement
}

那么将其应用于您的循环:

int[] ints = {1,2,3};
for (int index = 0; index < ints.length; index++) {
    int i = ints[index];
    System.out.println(i);
    i = 0;
}

5

i在这种情况下不是循环的索引,而是数组当前元素的值。因此更改它不会影响迭代过程。

等同于:

int[] ints = {1,2,3};
for (int index = 0; index < ints.length; index++) {
    int i = ints[index];
    System.out.println(i);
    i = 0;
}

我想我们选择相同的索引和长度变量名称并不是那么令人惊讶。 :-) - T.J. Crowder
2
@T.J.Crowder,我实际上没有为长度选择变量。至于“index”,我们不能使用“i”,对吧? :) - Eran
确实。 :-) (抱歉,今天早上眼睛有点不适应,不知怎么看到了一个不存在的长度变量。) - T.J. Crowder

2
for( int i : ints ) 

被称为增强型for循环。当您处理像这样的可迭代对象时,您将处理可迭代对象中的元素而不是索引。
您可以阅读此内容
对于每个元素i { // do this; }
在您的情况下,i不是索引,而是可迭代对象中的当前元素。
可迭代对象在此处不是Iterable实例。它是泛指任何可以使用类似方式进行迭代的集合。

ints不是可迭代的,它是一个数组(这很重要,因为实际上有两个增强型的for循环,一个用于可迭代对象,另一个用于数组)。 - T.J. Crowder

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