为什么foreach语句不会改变元素值?

时间:2013-04-05 22:09:34

标签: java foreach

以下如何打印boss而不是bass?

String boss = "boss";
char[] array = boss.toCharArray();

for(char c : array)
{
 if (c== 'o')
     c = 'a'; 
}
System.out.println(new String(array)); //How come this does NOT print out bass?It prints boss.

7 个答案:

答案 0 :(得分:58)

您正在更改迭代变量c。这不会改变数组的内容。迭代变量只是数组元素的副本。如果要修改数组,则需要明确地执行此操作:

for (int i = 0; i < array.length; i++) {
    if (array[i] == 'o') {
        array[i] = 'a';
    }
}

您的原始代码相当于(根据section 14.14.2 of the JLS):

for (int i = 0; i < array.length; i++) {
    char c = array[i];
    if (c == 'o') {
        c = 'a'; 
    }
}

更改局部变量的值永远不会改变任何其他内容 - 只是会更改局部变量。作业:

char c = array[i];

将数组中的值复制到局部变量中。它不会永久地将局部变量与数组元素相关联。

答案 1 :(得分:5)

这是因为c = 'a'正在将a分配给局部变量c,而该变量并未引用array本身的索引处的实际值。它只包含指定索引array处的值的副本。因此,更改实际上是在局部变量中进​​行的,而不是在array[i]引用的实际位置。 如果你想改变价值,你应该使用以下内容:

int i = 0;
for(char c : array)
{
 if (c== 'o')
     array[i] = 'a'; 
  i++;
}

答案 2 :(得分:3)

您的变量c会被更改,但不会更改数组内容。要更改数组,请不要使用c,直接操作数组。

for(int i = 0; i < array.length; i++)
{
 char c = array[i];
 if (c== 'o')
     array[i] = 'a';
}

答案 3 :(得分:3)

c的值是数组中值的副本。直接访问数组以更改有问题的值。

答案 4 :(得分:3)

您将“a”分配给局部变量c,但不分配给数组元素。要使它打印低音,你需要

for (int i = 0; i < array.length; i++) {
    if (array[i] == 'o') {
        array[i] = 'a';
    }
}

答案 5 :(得分:1)

在'for each'循环中应用的更改是在她的身体内部进行的(这是因为值被复制,而不是参考)。要进行参考,请使用'for'循环。

答案 6 :(得分:-1)

在我的观点中,作者实际上询问了如此构建函数的原因。 我找不到这样举动的任何充分理由。 这是因为 - 每个循环都是通用的或者至少是直接编辑的,所以获得的变量需要在各种方法中进行一些特殊处理吗?

此循环由其他字段和指令进行。 对于一个简单,快速和短命的报价似乎是好的。 我会在非常短的时间内使用它来编写 - 挑战,调试,工作压力。

使用lambda - 这会产生一组棘手的方法。 但那是遗产 不幸的是,高级编程和快速生活,IMO。