2013-04-05 6 views
28

Come mai le seguenti stampe capo e non basso?Perché JAVA foreach non modifica il valore dell'elemento?

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. 
+0

@KacyRaye a proposito, questo è un comportamento simile quando si utilizza il ciclo avanzato 'for' su classi di riferimenti oggetto (e la soluzione proposta qui è la stessa). –

risposta

40

stai cambiando l'iterazione variabili c. Questo non cambia il contenuto dell'array. La variabile di iterazione è solo una copia dell'elemento di matrice. Se si desidera modificare la matrice, è necessario fare in modo esplicito:

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

Il codice originale è equivalente (come da section 14.14.2 of the JLS) a:

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

La modifica del valore di una variabile locale non potrà mai cambiare qualcos'altro - è solo cambia la variabile locale. L'assegnazione:

char c = array[i]; 

copie il valore nella matrice in una variabile locale. Non associa la variabile locale all'elemento di matrice perpetuamente.

+1

Oh ok, grazie. Non ho capito che c era solo una copia. Grazie, ora ha senso. –

+0

Oh wow, quel codice equivalente lo ha reso davvero chiaro. Grazie. –

3

La variabile c viene modificata, ma non i contenuti della matrice. Per modificare la matrice, non utilizzare c, manipolare direttamente la matrice.

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

Questo perché c = 'a' sta assegnando a alla variabile locale c che non è associato il valore effettivo presente in quel indice del array stessa. È solo contenente una copia del valore presente nell'indice specificato di array. Quindi il cambiamento è in realtà fatta nella variabile locale non nella posizione attuale in cui array[i] fa riferimento .. Se si desidera modificare il valore si dovrebbe utilizzare il seguente anzi: valore

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

di c è una copia del valore in serie. Accedi direttamente alla matrice per modificare il valore in questione.

1

Le modifiche applicate nel ciclo "per ogni" vengono eseguite all'interno del suo corpo (poiché i valori vengono copiati, non i referenti). Per lavorare su referenti usa il ciclo 'for'.

3

Assegnando 'a' alla variabile locale c, ma non all'elemento di matrice. Per renderlo basso, è necessario

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

Nella mia prospettiva, l'autore in realtà chiede una ragione per la funzione di costruzione. Non riesco a trovare nessuna buona ragione per tale mossa. È perché per ogni ciclo si intende una variabile universale o per lo meno direttamente così ottenuta, sarebbe necessario un trattamento speciale in vari metodi?

Questo ciclo è gestito da campi e istruzioni aggiuntivi. Sembra essere buono solo per citazioni semplici, rapide e di breve durata. Lo userei in una prospettiva di un tempo molto breve per scrivere - sfide, debugging, pressione sul lavoro.

Con lambda - questo rende un gruppo di metodi complicati. Ma questa è un'eredità di programmazione ad alto livello e una vita breve, purtroppo, IMO.

Problemi correlati