web-dev-qa-db-fra.com

Déclarer des tableaux sans utiliser le mot-clé 'new' dans Java

Y a-t-il une différence entre les deux déclarations suivantes?

int arr[] = new int [5];

et

int arr1[] = {1,2,3,4,5};

Est arr1 déclaré sur la pile ou sur le tas?

24
Muhammad Ali Qadri

Il y a la différence évidente que l'un a tous les zéros et que l'autre contient [1..5].

Mais c'est la seule différence. Les deux sont des tableaux int de 5 éléments, les deux sont alloués de la même manière. C'est une simple commodité syntaxique de déclarer avec les accolades et sans new.

Notez que ce formulaire ne peut être utilisé que lorsque le tableau est déclaré:

int[] blah = {}

Mais non

int[] blah;
blah = {};

ou

return {};

Les objets (les tableaux sont des objets) sont alloués sur le tas.

32
Andy Turner

La première ligne place un nouvel objet sur le tas - un objet tableau contenant quatre éléments - chaque élément contenant un int avec une valeur par défaut de 0.

Le second fait de même, mais s'initialise avec des valeurs non par défaut. En allant plus loin, cette ligne unique fait quatre choses:

  • Déclare une variable de référence de tableau int nommée arr1
  • Crée un tableau int avec une longueur de cinq (cinq éléments).
  • Remplit les éléments du tableau avec les valeurs 1,2,3,4,5
  • Affecte le nouvel objet tableau à la variable de référence arr1

Si vous utilisez un tableau d'objets au lieu de primitives:

MyObject[] myArray = new MyObject[3];

alors vous avez un objet tableau sur le tas, avec trois références nulles de type MyObject, mais vous n'avez aucun objet MyObject. L'étape suivante consiste à créer des objets MyObject et à les affecter à des positions d'index dans le tableau référencé par myArray.

myArray[0]=new MyObject();
myArray[1]=new MyObject();
myArray[2]=new MyObject();

En conclusion: les tableaux doivent toujours avoir une taille au moment de leur construction. La machine virtuelle Java a besoin de la taille pour allouer l'espace approprié sur le tas pour le nouvel objet tableau.

8
debus
  • new int [5] peut être utilisé à la fois affectation et initialisation = , mais {1, 2} uniquement peut être utilisé comme déclaration avec initialisation. (Notez que new int[] {1, 2} peut également être utilisé à la fois affectation et initialisation )

  • new int [5] met toutes les entrées à zéro, mais {1, 2} et new int[] {1, 2} définit 1 et 2 dans les entrées respectives.

  • Les deux sont sur le tas , vous pouvez enregistrer leur référence d'objet.

    int arr[] = new int [5];
    // arr: object reference to the array
    

    ou

    int arr[] = {1, 2, 3, 4, 5};
    // arr: object reference to the array
    

Matériel utile:

5
frogatto

Je suis d'accord avec les autres réponses, de loin le plus souvent, votre tableau sera alloué sur le tas (peu importe laquelle des deux déclarations que vous utilisez). Cependant, selon la première réponse de Can Java allouer une liste sur la pile? , “dans des cas spéciaux, le Java virtual la machine peut effectuer une analyse d'échappement et décider d'allouer des objets… sur une pile ". Je pense que c'est vrai. La réponse à votre question est donc: cela dépend. Généralement sur le tas.

4
Ole V.V.

Objects réside dans heap. Arrays sont object type in Java langage de programmation. Documentation officielle ici

3
Pravat Panda