Un tableau Java de primitives est-il stocké dans la stack ou le tas?

J’ai une déclaration de tableau comme ceci:

int a[]; 

Ici, a est un tableau de type int primitif. Où est stocké ce tableau? Est-il stocké sur le tas ou la stack? Ceci est un type primitve int , tous les types primitifs ne sont pas stockés sur le tas.

Comme dit gurukulki, il est stocké sur le tas. Cependant, votre article a suggéré un malentendu probablement dû à une personne bien intentionnée propageant le mythe selon lequel “les primitifs vivent toujours sur la stack”. C’est faux. Les variables locales ont leurs valeurs sur la stack, mais toutes les variables primitives ne sont pas locales …

Par exemple, considérez ceci:

 public class Foo { int value; } ... public void someOtherMethod() { Foo f = new Foo(); ... } 

Maintenant, où vit la valeur? Le mythe suggère que c’est sur la stack – mais en réalité, cela fait partie du nouvel object Foo , et vit sur le tas 1 . (Notez que la valeur de f elle-même est une référence et réside dans la stack.)

De là, c’est une étape facile pour les tableaux. Vous pouvez penser à un tableau comme étant beaucoup de variables – donc new int[3] est un peu comme avoir une classe de cette forme:

 public class ArrayInt3 { public readonly int length = 3; public int value0; public int value1; public int value2; } 

1 En fait, c’est plus compliqué que cela. La distinction stack / heap est principalement un détail d’implémentation – je pense que certaines JVM, éventuellement expérimentales, peuvent dire quand un object ne “s’échappe” jamais d’une méthode, et peuvent allouer l’object entier sur la stack. Cependant, si vous choisissez de vous en occuper, il est conceptuel .

Il sera stocké sur le tas

parce que le tableau est un object en Java.

EDIT : si vous avez

 int [] testScores; testScores = new int[4]; 

Considérez ce code comme indiquant le compilateur, “Créez un object de tableau qui contiendra quatre pouces, et assignez-le à la variable de référence nommée testScores . Aussi, allez-y et définissez chaque élément int sur zéro. Merci.”

C’est un tableau de types primitifs qui en soi n’est pas primitif. Une bonne règle de base est que lorsque le nouveau mot-clé est impliqué, le résultat sera sur le tas.

Je voulais juste partager quelques tests que j’ai courus sur ce sujet.

Tableau de taille 10 millions

 public static void main(Ssortingng[] args) { memInfo(); double a[] = new double[10000000]; memInfo(); } 

Sortie:

 ------------------------ max mem = 130.0 MB total mem = 85.0 MB free mem = 83.6 MB used mem = 1.4 MB ------------------------ ------------------------ max mem = 130.0 MB total mem = 130.0 MB free mem = 48.9 MB used mem = 81.1 MB ------------------------ 

Comme vous le voyez, la taille de tas est augmentée de ~ 80 Mo, ce qui correspond à 10 m * sizeof (double).

Mais si on utilise Double au lieu de double

 public static void main(Ssortingng[] args) { memInfo(); Double a[] = new Double[10000000]; memInfo(); } 

La sortie affichera 40 Mo. Nous n’avons que des références doubles, elles ne sont pas initialisées.

Le remplir de double

 public static void main(Ssortingng[] args) { memInfo(); Double a[] = new Double[10000000]; Double qq = 3.1d; for (int i = 0; i < a.length; i++) { a[i] = qq; } memInfo(); } 

Encore 40MB. Parce qu'ils pointent tous vers le même object Double.

Initialisation avec double à la place

 public static void main(Ssortingng[] args) { memInfo(); Double a[] = new Double[10000000]; Double qq = 3.1d; for (int i = 0; i < a.length; i++) { a[i] = qq.doubleValue(); } memInfo(); } Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 

Ligne

 a[i] = qq.doubleValue(); 

est équivalent à

 a[i] = Double.valueOf(qq.doubleValue()); 

ce qui équivaut à

 a[i] = new Double(qq.doubleValue()); 

Comme nous créons de nouveaux objects Double à chaque fois, nous faisons sauter le tas. Cela montre que les valeurs de la classe Double sont stockées dans heap.

Dans le langage de programmation Java, les tableaux sont des objects, sont créés dynamicment et peuvent être affectés à des variables de type Object.

http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html