Arrays en Java y cómo se almacenan en la memoria

Estoy tratando de entender la configuración de la matriz en Java. ¿Por qué debe inicializar el espacio para cada objeto de la matriz una vez que haya creado la matriz? ¿Cómo se almacena en la memoria de esta manera?

[object][object] 

o así:

 [*class]->[object] [*class]->[object] 

En otras palabras, lo que realmente se está haciendo en la memoria. Does array[0] = new class() simplemente devuelve una referencia a una ubicación reservada en la memoria, y la class[] array = new class[10] crea algo a lo largo de las líneas de 10 punteros, que luego son asignados por el nuevas declaraciones?

Las matrices en Java almacenan una de dos cosas: valores primitivos ( int , char , …) o referencias (también conocidos como punteros).

Por lo tanto, el new Integer[10] crea espacio para 10 referencias Integer solamente. No crea 10 objetos Integer (o incluso espacio libre para 10 objetos Integer ).

Por cierto, eso es exactamente igual que los campos, las variables y los parámetros de método / constructor: también almacenan valores primitivos o referencias.

Si está familiarizado con C / C ++ , puede pensar en referencias de objetos Java como punteros a objetos (o punteros a estructuras). Asi que:

 Person p = new Person(); p.setName("Helios"); 

es:

  • declare ap puntero a una estructura Person (en la stack)
  • memoria de reserva para inicializar Person struct
  • asignar su dirección a p
  • ejecutar el método setName en el objeto referenciado por p

Entonces cuando estás haciendo:

 Person[] ps = new Person[5]; 

está reservando una matriz de 5 referencias a Persona . A continuación, deberá crear cada persona real y asignar cada referencia a un lugar en la matriz.

Editar: la (casi) versión C / C ++ del código anterior

 class Person { ... }; typedef PersonStruct* Person; // I don't remember if this declaration is ok Person p = new PersonStruct(); p -> setName(...); Person[] ps = new Person[5]; // ps is a variable in the stack pointing to the array in the heap // (being the array five references to the PersoStruct) 

y podrías hacer

 ps[3] = p; 

Las matrices son un espacio continuo de memoria, por lo que se ven más como su primer boceto:

[object-reference][object-reference]

array[0] = new class() almacenará en array[0] una referencia al nuevo objeto creado.

class[] array = new class[10] creará una matriz de diez espacios vacíos (o diez referencias nulas).