【问题标题】:Strange for-each loop java奇怪的for-each循环java
【发布时间】:2019-04-30 01:05:03
【问题描述】:

谁能告诉我,它为什么有效?

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

为什么我可以设置0为i,但还是会迭代?

【问题讨论】:

  • 为什么不能将 i 设置为 0?由于它通过值而不是引用传递,因此 i 设置为 0,但对于 int 没有任何变化。
  • 尝试在代码的各个部分打印 i 的值

标签: java loops foreach


【解决方案1】:

因为i 不是该循环中的控制变量,它只是数组中的一个值。根据JLS§14.4.2,对于数组,增强的for 循环等效于:

增强的 for 语句相当于基本的 for 语句,形式如下:

...

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;
}

【讨论】:

    【解决方案2】:
    for( int i : ints ) 
    

    被称为增强的 for 循环。当你像这样处理迭代时,你处理的是迭代中的元素而不是索引。

    你可以阅读这个

    对于每个元素 i { // 这样做 ; }

    在您的情况下,i 不是索引,它是可迭代的当前元素。

    iterable 不是 Iterable here 的实例。在一般意义上,任何可以像这样迭代的集合。

    【讨论】:

    • ints 不是可迭代对象,它是一个数组(这是相关的,因为实际上有两个增强的 for 循环,一个用于可迭代对象,另一个用于数组)。
    【解决方案3】:

    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 我实际上没有选择长度变量。至于index,我们不能用i,可以吗? :)
    • 确实如此。 :-) (抱歉,今天早上眼睛有点走神,不知何故看到了一个不存在的长度变量。)
    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2019-02-11
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多