Plonger dans le dilemme de l'itération : pourquoi les affectations de boucles Foreach ne modifient pas les données sous-jacentes
Malgré l'attrait intuitif de la modification directe des éléments dans un boucle foreach, comme le montre cet extrait Java :
String boss = "boss"; char[] array = boss.toCharArray(); for(char c : array) { if (c== 'o') c = 'a'; } System.out.println(new String(array)); //Unexpected result: "boss"
le code est surprenant donne du "boss" au lieu de la "basse" attendue.
Dévoilement de la copie
La clé pour comprendre ce paradoxe réside dans la nature de la variable d'itération "c. " Contrairement à la croyance populaire, « c » représente une simple copie de l’élément du tableau disponible. La modification de "c" n'a aucune incidence sur le contenu original du tableau.
Modification du tableau démystifiée
Pour véritablement modifier le tableau, une intervention explicite est nécessaire :
for (int i = 0; i < array.length; i++) { if (array[i] == 'o') { array[i] = 'a'; } }
Ici, le code accède et modifie les éléments réels du tableau, ce qui entraîne la mise à jour du tableau pour refléter les éléments souhaités. changements.
Comprendre l'interprétation JLS
La spécification du langage Java (JLS) interprète le code original comme équivalent à :
for (int i = 0; i < array.length; i++) { char c = array[i]; if (c == 'o') { c = 'a'; } }
Cette décomposition met l'accent que "c" est simplement une copie qui ne peut pas influencer le tableau.
Essentiellement, les boucles foreach fournissent un des moyens de parcourir les collections sans interférer avec leur structure sous-jacente. La modification directe du tableau nécessite de travailler explicitement avec l'index et les éléments du tableau.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!