¿Cómo funciona la matriz internamente en Java?

Esta consulta se publica básicamente para entender puntos como

  • Un objeto es una instancia de clase o una matriz;

  • Una matriz es una subclase de la clase Object ;

  • Todo lo que se instancia, aparte de primitivo, es un objeto en Java.

Aquí está mi entendimiento de trabajar con arreglos en Java.

Teniendo en cuenta el siguiente progtwig,

 /* dummy.java */ class C { private int i; public C() { i = 1; System.out.println("Am in constructor"); } } public class dummy { public static void main(String[] args) { C[] c = new C[2]; // Line 11 c[0] = new C(); System.out.println(c); } } 

Un objeto de tipo class [LC se crea en tiempo de ejecución después de ejecutarse,

 C[] c = new C[2]; //Line 11 

En el código anterior. class [LC es una subclase inmediata de la clase Object . La variable de referencia c apunta a este objeto (que se muestra en el límite rojo a continuación) después de ejecutar la Line 12 en el código anterior. Las variables de referencia se sitúan en la stack y un objeto de tipo class C irá en el montón.

introduzca la descripción de la imagen aquí

Para un cambio debajo de las line 11 & 12 en el código anterior

 C[][] c = new C[2][2]; c[0][0] = new C(); 

Hará la representación como se muestra abajo.

introduzca la descripción de la imagen aquí

¿Mi entendimiento es correcto? En caso afirmativo, ¿puede explicar más sobre el uso de la class [LC en tiempo de ejecución para crear una instancia de un objeto?

Nota: C[].class proporciona el tipo real en tiempo de ejecución, que es la class [LC .

Para responder a su pregunta: sí, en Java (y C #), casi todo está dividido en múltiples trozos discretos de memoria a los que acceden los punteros. Esto no solo incluye su matriz bidimensional sino también cualquier objeto incrustado dentro de su objeto C. En C ++, si tiene una matriz (unidimensional o no) de 10 objetos y cada uno de estos objetos contiene 10 objetos incrustados, puede asignar todo esto con Una sola pieza de memoria. En C # y Java, tendrá un mínimo de 101 asignaciones de memoria para almacenar todo esto (si todos los objetos incrustados son objetos simples) en el caso de una matriz monodimensional y más en el caso de una matriz multidimensional.

Sin embargo, esta explosión de piezas de memoria no debería verse como algo muy malo, ya que le libera de la dificultad de administrar la asignación de memoria que puede tener con C / C ++ y, en la mayoría de los casos, la potencia de cualquier CPU moderna. Generalmente es suficiente para empujarlo hacia adelante a una velocidad suficiente.