Array in Java e come sono memorizzati in memoria

Sto cercando di capire l’impostazione dell’array in java. Perché è necessario inizializzare lo spazio per ogni object nell’array, dopo aver creato l’array. Come è memorizzato in memoria in questo modo:

[object][object] 

o in questo modo:

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

In altre parole, ciò che viene effettivamente fatto nella memoria. L’ array[0] = new class() restituisce semplicemente un riferimento ad un percorso riservato in memoria, e l’istruzione class[] array = new class[10] crea qualcosa sulla falsariga di 10 puntatori, che vengono successivamente assegnati dal nuove dichiarazioni?

Gli array in Java memorizzano una delle due cose: o valori primitivi ( int , char , …) o riferimenti (noti anche come puntatori).

Quindi, il new Integer[10] crea spazio solo per 10 riferimenti Integer . Non crea 10 oggetti Integer (o anche spazio libero per 10 oggetti Integer ).

Per inciso, è esattamente come funzionano i campi, le variabili ei parametri metodo / costruttore: anche essi memorizzano solo valori o riferimenti primitivi.

Se hai familiarità con C / C ++ puoi pensare ai riferimenti agli oggetti Java come puntatori agli oggetti (o puntatori alle strutture). Così:

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

è:

  • dichiarare il puntatore ap a una struct Person (nello stack)
  • riserva memoria per e inizializza la struttura Person
  • assegna il suo indirizzo a p
  • eseguire il metodo setName sull’object a cui fa riferimento p

Quindi quando stai facendo:

 Person[] ps = new Person[5]; 

stai prenotando una serie di 5 riferimenti a Persona . Successivamente dovrai creare ogni persona reale e assegnare ogni riferimento a un posto nell’array.

Modifica: la versione (quasi) C / C ++ del codice precedente

 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) 

e tu potresti farlo

 ps[3] = p; 

Gli array sono uno spazio continuo di memoria, quindi sembrano più il tuo primo schizzo:

[object-reference][object-reference]

array[0] = new class() memorizzerà array[0] un riferimento al nuovo object creato.

class[] array = new class[10] creerà una matrice di dieci slot vuoti (o dieci riferimenti null).