¿Por qué la asignación a la variable de iteración en un bucle foreach no cambia los datos subyacentes?
¿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.
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.
Esto se debe a que c = 'a'
se asigna a
a la variable local c
que no hace referencia al valor real presente en ese índice de sí array
mismo. 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++;
}
El valor de c es una copia del valor en la matriz. Acceda a la matriz directamente para cambiar el valor en cuestión.
Su variable c
se 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';
}