web-dev-qa-db-fra.com

Pourquoi l'instruction foreach ne modifie-t-elle pas la valeur de l'élément?

Comment se fait-il que les imprimés suivants soient boss et non basse?

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.
47
Kacy Raye

Vous modifiez la variable d'itération c. Cela ne change pas le contenu du tableau. La variable d'itération n'est qu'une copie de l'élément de tableau. Si vous souhaitez modifier le tableau, vous devez le faire explicitement:

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

Votre code d'origine est équivalent (selon section 14.14.2 du JLS ) à:

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

Changer la valeur d'une variable locale ne changera jamais rien d'autre - il juste change la variable locale. La tâche:

char c = array[i];

copie la valeur du tableau dans une variable locale. Il n'associe pas perpétuellement la variable locale à l'élément de tableau.

65
Jon Skeet

Ceci est dû au fait c = 'a' assigne a à la variable locale c qui ne fait pas référence à la valeur réelle présente à cet index du array lui-même. Il contient simplement une copie de la valeur présente à l'index spécifié de array. Ainsi, le changement est réellement effectué dans la variable locale et non à l'emplacement réel où array[i] fait référence .. Si vous voulez changer la valeur, vous devez en effet utiliser ce qui suit:

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

Votre variable c est modifiée, mais pas le contenu du tableau. Pour modifier le tableau, n'utilisez pas c, manipulez directement le tableau.

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

la valeur de c est une copie de la valeur du tableau. Accédez directement au tableau pour modifier la valeur en question.

3
dan

Vous affectez "a" à la variable locale c, mais pas à l'élément de tableau. Pour le faire imprimer des basses, il vous faudrait

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

Les changements appliqués dans la boucle "pour chaque" sont effectués juste à l'intérieur de son corps (c'est parce que les valeurs sont copiées, pas les références). Pour travailler sur les références utilisez la boucle 'for'.

1
Michał Tabor