web-dev-qa-db-fra.com

Comment le tableau primitif fonctionne-t-il avec new pour chaque boucle en Java?

Je comprends que les nouveautés pour chaque boucle fonctionnent avec Iterable et les tableaux, mais je ne sais pas ce qui se passe dans les coulisses lorsque vous travaillez avec des tableaux.

Quelqu'un peut-il m'aider à comprendre cela? Merci d'avance.

int[] number = new int[10];

for(int i: number) {

}
19
AS_

La boucle est équivalente à:

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

où j est une référence générée en interne qui n'entre pas en conflit avec les identificateurs d'utilisateur normaux.

16
Patricia Shanahan

Un peu tard, mais le voici.

Le compilateur sait si vous utilisez l'instruction de boucle for-each pour une collection ou pour un tableau.

Si utilisé pour la collecte, Le compilateur traduit la boucle for-each en boucle for équivalente à l'aide d'une variable Iterator.

Si utilisé pour un tableau, Le compilateur convertit la boucle for-each en boucle for équivalente à l'aide d'une variable d'index.

Voici une description sur Oracle.com

9
DwB

Dans votre code, vous allouez un tableau de 10 entiers dans la mémoire et obtenez une référence à celui-ci. Dans la boucle for, vous parcourez simplement chaque élément du tableau, qui sera initialement égal à 0 pour tous les éléments. La valeur de chaque élément sera stockée dans la variable i déclarée dans votre boucle for lors de l'itération des éléments du tableau.

3
Edwin Dalorzo

cela équivaut à:

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

C'est l'équivalent de:

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

Notez que le forEach n’évaluera pas la longueur de chaque boucle. Ceci pourrait également être éliminé par la JVM, mais particulièrement dans le cas de collections, Où certains utiliseraient 

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

cela fait une (petite) différence au plus rapide

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

Le pour chacun des tableaux est essentiellement "sucre" sur cette construction: 

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

J'imagine que cela a été fourni en tant que construction du langage afin que les gens puissent utiliser la boucle for for améliorée au-dessus d'une structure qui a été itérée à l'ancienne.

0
Woot4Moo

IntStream.range(1,4) peut être utilisé, si vous utilisez Java 8.

0
KayV