61

为什么下面的印刷品是老板而不是贝司?

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.
4

6 回答 6

77

您正在更改迭代变量c。这不会改变数组的内容。迭代变量只是数组元素的副本。如果你想修改数组,你需要明确地这样做:

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

您的原始代码(根据JLS 的第 14.14.2 节)等效于:

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

改变局部变量的值永远不会改变其他任何东西——它只会改变局部变量。那作业:

char c = array[i];

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

于 2013-04-05T22:11:09.950 回答
9

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

int i = 0;
for(char c : array)
{
 if (c== 'o')
     array[i] = 'a'; 
  i++;
}
于 2013-04-05T22:11:14.163 回答
4

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

于 2013-04-05T22:12:19.070 回答
3

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

for(int i = 0; i < array.length; i++)
{
 char c = array[i];
 if (c== 'o')
     array[i] = 'a';
}
于 2013-04-05T22:11:03.053 回答
3

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

for (int i = 0; i < array.length; i++) {
    if (array[i] == 'o') {
        array[i] = 'a';
    }
}
于 2013-04-05T22:12:48.080 回答
1

在“for each”循环中应用的更改是在她的身体内部进行的(这是因为值是复制的,而不是引用)。要处理引用,请使用“for”循环。

于 2013-04-05T22:12:22.670 回答