11
votes

Tableaux en Java et comment ils sont stockés en mémoire

J'essaie de comprendre la configuration de la matrice en Java. Pourquoi devez-vous initialiser l'espace pour chaque objet dans la matrice, après avoir créé le tableau. Comment est-il stocké dans la mémoire comme ceci: xxx

ou comme ceci: xxx

En d'autres termes, qu'est-ce qui est réellement fait en mémoire . Est-ce que array [0] = nouvelle classe () vient de renvoyer une référence à un emplacement réservé en mémoire et de la classification [] = nouvelle classe [10] Déclaration Créer quelque chose Dans le sens des 10 pointeurs, qui sont ensuite assignés par les nouvelles déclarations?


1 commentaires

3 Réponses :


18
votes

Tableaux dans Java Store L'une des deux choses: soit des valeurs primitives ( int , char , ...) ou des références (a.k.a pointeurs).

donc, neuf entier [10] crée de l'espace pour 10 Integer Références uniquement. Il fait pas créer 10 Objets d'integer (ou même de l'espace libre pour 10 integer objets).

Incidemment, c'est exactement la même manière que les champs, les variables et les paramètres de méthode / constructeur fonctionnent: ils ne stockent pas uniquement les valeurs primitives ou les références.


3 commentaires

Y a-t-il une différence de mémoire entre la manière dont les matrices de primitives sont stockées que des tableaux d'objets


Comme il n'y a pas de références à des valeurs primitives, les valeurs elles-mêmes sont stockées dans la matrice au lieu de références.


Qu'en est-il de la longueur? Les tableaux en Java connaissent leur longueur. N'est-ce pas stocké quelque part? Ou est-ce une chose de compilation seule?



0
votes

Les tableaux sont un espace continu de mémoire, ils ressemblent donc à plus de votre premier croquis:

[référence d'objet] [référence-référence]

Array [0] = Nouvelle classe () stockera dans Array [0] une référence au nouvel objet créé.

classe [] tableau = nouvelle classe [10] créera un tableau de dix emplacements vides (ou des références de dix nuls).


1 commentaires

En fait, il est similaire au deuxième exemple de la question de l'OP.



6
votes

Si vous connaissez C / C ++ , vous pouvez penser à des références d'objet Java en tant que pointeurs sur des objets (ou des pointeurs vers des structures). Donc: xxx

est:

  • Déclarez un pointeur P à une personne structurée (dans la pile)
  • Mémoire de réserve pour et initialiser la structure de la personne
  • attribue son adresse à p
  • Méthode d'exécution SetName de la méthode sur l'objet référencé par P

    Alors, lorsque vous faites: xxx

    Vous réservez un tableau de 5 références à la personne . Ensuite, vous devrez créer chaque personne réelle et affecter chaque référence à un endroit dans la matrice.

    EDIT: La version (presque) C / C ++ du code précédent xxx

    et vous pouvez faire xxx


2 commentaires

Donc, c'est presque comme si vous créez une personne * p [] Array, puis en attribuez-en une à une à une à p [0] tout au long de la [longueur-1]?


Oui. C'est comme ça. Dans mon exemple de code PS est le tableau. C'est aussi une référence (située dans la pile) à la structure de la matrice (située dans le tas). La structure de la matrice est celle qui tiendra les références aux objets de cinq personnes. Je vais ajouter une traduction C / C ++ :)