为什么java增强for循环给出的结果与“传统”不同?

时间:2013-12-21 13:27:05

标签: java foreach

我认为增强的for循环只是一些语法糖,其行为与“传统”for循环完全相同。我在下面编写了一些代码,表明情况并非如此。
产出不同的原因是什么?或者我错过了什么,我应该停止以这种方式编写代码?

为什么不引用temp [(当前索引)]?对我而言,

是没有意义的
String temp[] = { "foo:bar" };
for (String t : temp)
    t = t.split(":", 2)[1];
System.out.println(temp[0].startsWith("foo")); //true
for (int t = 0; t < temp.length; t++)
    temp[t] = temp[t].split(":", 2)[1];
System.out.println(temp[0].startsWith("foo")); //false

3 个答案:

答案 0 :(得分:7)

foreach循环实际上等同于

for (int i = 0; i < temp.length; i++)
    String t = temp[i];
    t = t.split(":", 2)[1];
}

不会改变数组的任何元素。

答案 1 :(得分:3)

您没有使用这两个测试测试相同的字符串。

当您第一次执行测试时,字符串是(仍然)"foo:bar" - 您的第一个循环不会更改字符串,它只会更改循环变量t

但这一行:

temp[t] = temp[t].split(":", 2)[1];

将字符串"foo:bar"用冒号分隔后覆盖第二个元素,即"bar",它不以"foo"开头。

答案 2 :(得分:0)

for (int t = 0; t < temp.length; t++)
        {
            temp[t] = temp[t].split(":", 2)[1];
            System.out.println(temp[t]);
        }

这会打印“bar”,这意味着在for循环中覆盖了值“foo”。 所以,最终的结果是假的。