Initialisation de tableau en java

J'ai remarqué qu'on pouvait écrire du code comme ça, ce qui est parfaitement normal, d'ailleurs:

int arrays[] = {1, 2, 3};
for (int n : arrays)
   System.out.println(n);

Mais je ne vois pas en quoi ce qui suit est illégal:

for (int n : {1, 2, 3})
   System.out.println(n);

Du point de vue d'un compilateur écrivain, cela n'introduit aucune ambiguïté, n'est-ce pas? On peut s'attendre à ce que le type du tableau soit le même que l'élément déclaré précédemment. En d'autres termes, n est déclaré comme int, donc le tableau doit ÊTRE int[]

33
demandé sur Eng.Fouad 2013-04-22 09:25:29

5 réponses

Vous avez besoin de cette syntaxe:

for(int n : new int[]{1, 2, 3})
   System.out.println(n);
36
répondu Eng.Fouad 2013-04-22 05:27:21

À partir de la spécification du langage Java, §10.6-initialiseurs de Tableau :

Un initialiseur de tableau est écrit sous la forme d'une liste expressions, entourées d'accolades { et }.

Une virgule de fin peut apparaître après la dernière expression d'un tableau initialiseur et est ignoré.

Chaque initialiseur de variable doit être compatible avec l'affectation (§5.2) avec le type de composant du tableau, ou une erreur de compilation se produit.

C'est une erreur de compilation si le type de composant de la matrice de initialisé n'est pas reifiable (§4.7).

Un initialiseur de tableau fait partie d'une expression de création de tableau , qui définit que vous avez besoin de l'une de ces quatre formes pour initialiser avec succès un tableau:

ArrayCreationExpression:
    new PrimitiveType DimExprs Dimsopt
    new ClassOrInterfaceType DimExprs Dimsopt
    new PrimitiveType Dims ArrayInitializer 
    new ClassOrInterfaceType Dims ArrayInitializer

Encore une fois, à partir des spécifications:

C'est une erreur à la compilation si le ClassOrInterfaceType ne dénote pas un type reifiable (§4.7). Sinon, le ClassOrInterfaceType peut nommer n'importe quel type de référence nommé, même un type de classe abstrait (§8.1.1.1) ou un type d'interface (§9).

C'est pourquoi vous avez besoin de la syntaxe new int[] {1, 2, 3}.

EDIT: Pour obtenir plus dans les nuances de votre question:

Du point de vue d'un compilateur, cela n'introduit aucun l'ambiguïté, n'est ce pas? On peut s'attendre à ce que le type du tableau soit même type que l'élément déclaré précédemment. Dans d'autres termes, n est déclaré comme int, donc le tableau doit être int []

Non. Il y aambiguïté . Comme exemple, quelle est la différence entre les deux énoncés suivants?

int[] arr1 = new int[] {1, 2, 3};
short[] arr2 = new short[] {1, 2, 3};

La principale différence est ce qu'ils compilent en bytecode. L'un est évidemment un int, l'autre est évidemment un court. Cependant, sans la capacité de dire quel type de données est qui (sans les valeurs dans le tableau dépassant Short.MAX_VALUE), il serait impossible d'affirmer que, de ce tableau, au-delà de l'ombre d'un doute, est un int. Rappelez-vous qu'un short tombe dans la plage d'un int, de sorte que vous pouvez facilement entrer dans des scénarios difficiles / bizarres lors de l'utilisation de cela.

Ça devient plus amusant: c'est un code valide.

for(int i : arr2) {
    System.out.println(i);
}

Encore une fois, tant que les éléments de arr2 ne pas dépasser Short.MAX_VALUE, vous pouvez vous en sortir avec cette référence ambiguë entre short et int.

C'est une autre raison pour laquelle le compilateur ne peut pas il suffit de déduire que vous voulez dire int. Vous pourriez signifier short.*

*: peu de gens le feraient, mais c'est juste au cas où il y en aurait faire.

36
répondu Makoto 2013-04-22 05:48:29

Parce que les tableaux sont des objets et doivent être instanciés. Java ne reconnaît pas {} par lui-même comme un tableau. Il vous permet cependant d'utiliser un bloc de code (c'est-à-dire code in {..}) pour définir les éléments initiaux du tableau.

La façon dont vous accomplissez ceci est décrite par la réponse ci-dessus.

7
répondu Chris Chambers 2013-04-22 05:29:01

Je pense que chaque fois que nous créons une variable, le compilateur lui alloue automatiquement de la mémoire.La quantité de mémoire créée dépend du type de compilateur que vous êtes using.In la première instruction que vous déclarez un tableau avec les entrées, le compilateur crée automatiquement de l'espace pour l'élément de tableau présent dans le tableau mais lorsque vous déclarez le tableau dans la boucle for, il ne crée que 2 octets de chaque exécution.

Par ex.

int x; // create 2 bytes of memory

Cet espace est attribué en permanence à int x si vous insérez valeur dans cet espace ou pas.

int x = "123"; // This code also take 2 bytes of memory and contain value = 123

De même,

int a[] ={1,2,3} // create 6 byte of space in memory, 2 byte for each integer variable.

D'autre part, lorsque vous déclarez le tableau dans la boucle for sans utiliser le nouvel identifiant, le compilateur suppose qu'il s'agit d'une variable int et ne crée que 2 octets d'espace mémoire et le programme donne une erreur.

for (int n : {1, 2, 3}) // create only 2 bytes of memory

Donc, en utilisant le nouvel identifiant, nous allouons un nouvel espace mémoire et insérons des valeurs qui sont données dans les accolades.

0
répondu Sumit Sharma 2013-05-13 12:48:06

Pour être honnête, la seule erreur que je vois dans votre explication est comment pouvez-vous dire à un ordinateur de passer par un objet/mémoire qui n'existe pas?

Vous devez d'abord créer quelque chose pour le laisser passer, ici, vous n'avez rien créé et l'erreur logique existe dans votre tête parce que vous avez pensé plus profondément que les règles de création de Java lui-même.

Ne vous inquiétez pas, je me retrouve dans des situations comme vous mais le plus important est d'apprendre comment Java a été programmé la première!

-1
répondu user2282158 2013-04-22 10:22:16