Java 为什么foreach语句不更改元素值?

Java 为什么foreach语句不更改元素值?,java,foreach,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. 变量c会发生更改,但数组内容不会发生更改。要

为什么下面的照片是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.

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

for(int i = 0; i < array.length; i++)
{
 char c = array[i];
 if (c== 'o')
     array[i] = 'a';
}
for(int i=0;i
您正在更改迭代变量
c
。这不会更改数组的内容。迭代变量只是数组元素的一个副本。如果要修改数组,则需要显式修改:

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

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

这是因为
c='a'
a
赋值给局部变量
c
,而该局部变量不引用
数组本身索引处的实际值。它只包含
数组的指定索引中存在的值的副本。因此,更改实际上是在局部变量中进行的,而不是在
array[i]
引用的实际位置。。 如果要更改值,应使用以下命令:

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

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

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

将“a”赋值给局部变量c,而不是数组元素。要让它打印低音,你需要

for (int i = 0; i < array.length; i++) {
    if (array[i] == 'o') {
        array[i] = 'a';
    }
}
for(int i=0;i
哦,好的,谢谢。我不明白c只是一个副本。谢谢,现在这很有意义了。@BaroudiSafwen:数组元素的副本在每次迭代中都会制作出来。你说的“变形”是什么意思?我很不明白你在说什么。@KacyRaye顺便说一句,在对象引用类上使用增强的
for
循环时,这是一种类似的行为(这里提出的解决方案是相同的)。在这一点上,使用普通的for循环不是更好吗?
int i = 0;
for(char c : array)
{
 if (c== 'o')
     array[i] = 'a'; 
  i++;
}
for (int i = 0; i < array.length; i++) {
    if (array[i] == 'o') {
        array[i] = 'a';
    }
}