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

Kac*_*aye 49 java foreach

为什么以下打印老板而不是低音?

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.
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 67

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

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

您的原始代码是相同的(根据JLS第14.14.2节):

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

更改局部变量的值永远不会改变其他任何东西 - 它只是更改局部变量.分配:

char c = array[i];
Run Code Online (Sandbox Code Playgroud)

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

  • 哦,好的,谢谢.我不明白c只是一个副本.谢谢,现在有道理. (2认同)

Vis*_*l K 7

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

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