2013-01-10 13 views
14

Capisco che il nuovo per ogni ciclo funzioni con Iterable e gli array, ma non so cosa succede dietro le quinte quando si lavora con gli array.Come funziona la matrice primitiva con una nuova per ogni ciclo in Java?

Qualcuno può aiutarmi a capire questo? Grazie in anticipo.

int[] number = new int[10]; 

for(int i: number) { 

} 
+0

BTW, avrebbe aiutato se avesse commentato il motivo per cui la questione è stata giù votato. –

+0

upvoted, se lo trovi interessante, specialmente se è equivalente su base byte byte ad un normale (efficiente) loop. Ma questo nessuno ha risposto esattamente. – AlexWien

risposta

3

Nel codice, si assegna un array di 10 numeri interi nella memoria e si ottiene un riferimento ad esso. Nel ciclo for si semplicemente itera su ogni elemento dell'array, che inizialmente sarà 0 per tutti gli elementi. Il valore di ogni elemento verrà memorizzato nella variabile i dichiarata nel ciclo for mentre si iterano gli elementi dell'array.

12

Il ciclo è equivalente a:

for(int j = 0; j < number.length; j++) { 
    int i = number[j]; 
    ... 
} 

dove j è un riferimento generata internamente che non sia in conflitto con normali identificativi dell'utente.

+0

È vero anche per gli array di tipi di riferimento? Per esempio.Java utilizzerà internamente questa implementazione su un oggetto [] o farà qualcos'altro (come convertirlo in un Iterable)? – Karakuri

+0

@Karakuri Non sto nemmeno affermando che questo è il modo in cui è effettivamente implementato per gli array primitivi, solo che il comportamento richiesto è equivalente. Anche il comportamento richiesto per 'Object []' è equivalente. –

1

L'ad ogni superamento array è essenzialmente "zucchero" su questo costrutto:

for(int i = 0;i<number.length;i++) 
{ 
} 

mi immagino questo è stato fornito come un costrutto del linguaggio in modo che la gente potesse utilizzare il maggiore ciclo for su una struttura che è stato ripetuto alla vecchia maniera.

+0

Ciò fornirebbe i valori da 0 a lunghezza-1. Dovrebbe essere prendendo i valori degli elementi dell'array, tutti 0 nel codice di esempio. –

+1

@PatriciaShanahan errato, non c'è alcun codice tra le mie parentesi graffe. Stavo spiegando il costrutto che si stava verificando dietro lo zucchero – Woot4Moo

2

questo equivale a:

for(int x = 0; x < number.length; x++) { 
    int i = number[x]; 
} 
1

Questo è l'equivalente di:

final int len = number.length; 
for(int j = 0; j < len; j++) { 
    int i = number[j]; 
} 

Nota che il forEach non valuterà la .length in ogni ciclo. Questo potrebbe essere anche essere eliminati dalla JVM, ma soprattutto in caso di collezioni, dove qualcuno potrebbe usare

for(int j = 0; j < collection.size(); j++) { 

fa una (piccola) differenza per la più veloce

int len = collection.size() 
for(int j = 0; j < len; j++) { 
+0

Grazie, non ero a conoscenza di ogni ciclo che non valutava la lunghezza ogni volta. –

6

un po 'tardi , ma eccolo qui.

Il compilatore sa se si sta utilizzando l'istruzione loop per ogni raccolta o per un array.

Se utilizzato per la raccolta, , il compilatore converte il ciclo for-each in loop equivalente utilizzando Iterator.

Se utilizzato per un array, , il compilatore traduce il ciclo for-each nel loop corrispondente utilizzando una variabile di indice.

Here is a description at oracle.com

0

IntStream.range (1,4) può essere utilizzato, se si utilizza Java 8.

+0

Grazie !!!!!!!!!! –

Problemi correlati