¿Por qué la asignación a la variable de iteración en un bucle foreach no cambia los datos subyacentes?

Resuelto Kacy Raye asked hace 11 años • 6 respuestas

¿Cómo es que las siguientes impresiones son boss y no 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.
Kacy Raye avatar Apr 06 '13 05:04 Kacy Raye
Aceptado

Estás cambiando la variable de iteración c. Eso no cambia el contenido de la matriz. La variable de iteración es solo una copia del elemento de la matriz. Si desea modificar la matriz, debe hacerlo explícitamente:

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

Su código original es equivalente (según la sección 14.14.2 de JLS ) a:

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

Cambiar el valor de una variable local nunca cambiará nada más: solo cambia la variable local. La asignación:

char c = array[i];

copia el valor de la matriz en una variable local. No asocia la variable local con el elemento de la matriz perpetuamente.

Jon Skeet avatar Apr 05 '2013 22:04 Jon Skeet

Esto se debe a que c = 'a'se asigna aa la variable local cque no hace referencia al valor real presente en ese índice de sí arraymismo. Solo contiene una copia del valor presente en el índice especificado de array. Entonces, el cambio en realidad se realiza en la variable local, no en la ubicación real donde array[i]se hace referencia. Si desea cambiar el valor, debe usar lo siguiente:

int i = 0;
for(char c : array)
{
 if (c== 'o')
     array[i] = 'a'; 
  i++;
}
Vishal K avatar Apr 05 '2013 22:04 Vishal K

El valor de c es una copia del valor en la matriz. Acceda a la matriz directamente para cambiar el valor en cuestión.

dan avatar Apr 05 '2013 22:04 dan

Su variable cse cambia, pero no el contenido de la matriz. Para cambiar la matriz, no utilice c, manipule la matriz directamente.

for(int i = 0; i < array.length; i++)
{
 char c = array[i];
 if (c== 'o')
     array[i] = 'a';
}
rgettman avatar Apr 05 '2013 22:04 rgettman