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?
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.
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:
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.
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:
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.
Objects
réside dans heap
. Arrays
sont object type
in Java langage de programmation. Documentation officielle ici