Matrices 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 en la matriz, después de haber 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. ¿ array[0] = new class()Simplemente devuelve una referencia a una ubicación reservada en la memoria, y la class[] array = new class[10]declaración crea algo en la línea de 10 punteros, que luego son asignados por las nuevas declaraciones?

Respuesta 1

Arrays en Java tienda de una de dos cosas: o valores primitivos ( int, char, ...) u otras indicaciones (también conocido como punteros).

Entonces, new Integer[10]crea espacio solo para 10 Integerreferencias. No , no crear 10 Integerobjetos (o incluso el espacio libre para 10Integer objetos).

Por cierto, esa es exactamente la misma forma en que funcionan los campos, las variables y los parámetros de método / constructor: ellos también solo almacenan valores primitivos o referencias.

Respuesta: 2

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

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

es:

  • declarar un puntero ap a una estructura Persona (en la pila)
  • reservar memoria para e inicializar la estructura de Persona
  • asignar su dirección a p
  • ejecutar el método setName en el objeto al que hace referencia p

Entonces cuando estás haciendo:

Person[] ps = new Person[5];

está reservando una serie 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 versión (casi) 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;
Respuesta: 3

En una entrevista, me pidieron que verificara si el siguiente código funciona según lo previsto. ConcurrentHashMap <Integer, Integer> chm = new ConcurrentHashMap <> (); if (chm.get (key)! = null) {chm ....

La compilación escalonada de HotSpot utiliza el intérprete hasta que un umbral de invocaciones (para métodos) o iteraciones (para bucles) desencadena una compilación del cliente con autoperforación. La compilación del cliente es ...

Quiero determinar si una cadena dada coincide, ignorando mayúsculas y minúsculas, uno de los elementos en una Lista <String>. Estoy tratando de lograr esto con las transmisiones de Java 8. Aquí está mi intento de usar .orElse (falso): ...

Estoy haciendo una clase en Java que descarga un archivo específico de un servidor. Tengo un método que puede descargar directamente desde un servidor FTP y uno desde un servidor SFTP. Sin suposiciones hechas ...