2013-05-16 9 views
8

Sto facendo un po 'di studio e mi sono imbattuto in una domanda che chiede di mostrare il diagramma di memoria corretta del codice seguente:Che va in pila o heap?

int [] d1 = new int[5]; 
d1[0] = 3; 

Integer [] d2 = new Integer[5]; 
d2[0] = new Integer(3); 

ArrayList d3 = new ArrayList(); 
d3.add(3); 

Ecco il mio tentativo di un diagramma di memoria, ma può essere corretto:

enter image description here

ho capito le cose come oggetti, variabili di istanza, e "nuovi" casi sono tutti sul mucchio e le cose come le variabili locali e tipi primitivi sono in pila, ma io sono ancora confuso quando si tratta di tipi di array.

Qualsiasi aiuto è apprezzato.

+0

Un array è alla fine una 'Object' (anche un array di primitive). A proposito, sei vicino alla risposta finale. –

+0

@LuiggiMendoza Ho cambiato il mio diagramma. Questa sarebbe la risposta corretta? – blutuu

+2

Quasi, la JVM mantiene un pool per gli oggetti 'Integer' da -128 a 127. Quindi' Intero' con valore 3 sarà uguale sia per l'array 'd2' che per' d3' ArrayList. –

risposta

5

Qualsiasi oggetto su Java vive in heap.

In Java Array è anche un oggetto e quindi l'oggetto matrice vive nell'heap.

analitico: -

Quando si scrive

int a=new int[5], 

il (new int [5]) parte crea oggetto e, quindi, vive sul mucchio.

Integer x=new Integer(10000) 

è anche un oggetto (ricorda che il nuovo operatore creerà sempre un nuovo oggetto).

e quindi quando Wright,

Integer [] d2 = new Integer[5]; 

esso è array di numeri interi oggetto.

Per quanto riguarda ArrayList, è anche una classe ma racchiude l'oggetto matrice e aggiunge memoria dinamica ad esso. Così,

ArrayList d3 = new ArrayList(); 

crea nuovo oggetto e, quindi, vivono sul mucchio.

consideri classe ArrayList come:

class ArrayList{ 
    int index=0; 
    Object[] obj=new Object['some integer value (depends on JVM)']; 
    public void add(Object o){ 
     obj[index]=o; 
     index++; 
    } 
    //other methods 
} 

in modo che quando si scrive d3.add (5) in realtà d3.add (new Integer (5)) viene chiamato.

Ricorda una regola d'oro: In java qualunque oggetto tu crei in diretta su HEAP e il loro riferimento in diretta in pila.

Prova della matrice essendo oggetto: -

int[] a={4,3,1,2}; 
System.out.println(a instanceof Object); 

// stampa veri

+0

Bello. Grazie per la spiegazione. Mi sento come se avessi uno schema corretto ora. Vedi qualcosa di sbagliato in questo? – blutuu

+0

nessun problema nel diagramma, il suo perfetto amico !!!!!!! – WebServer

+0

Grazie per il feedback. – blutuu

0

Le matrici non sono primitive in java ha classe concreta in java.

Una matrice è un oggetto contenitore che contiene un numero fisso di valori di un singolo tipo. La lunghezza di un array viene stabilita quando l'array è creato.

System.out.print(int[].class.toString()); 

Quindi, quando si creano oggetti di qualsiasi matrice digitare deve andare a te mucchio di spazio.

+0

Oh okay. Ho visto 'int' e ho capito che la matrice era primitiva. – blutuu

+0

thery non sono in java. :) –

+0

Gotcha. Capisco. – blutuu

0

Ecco un'alternativa, corretta diagramma memoria.

+0

questo diagramma di memoria non è ancora corretto, quindi se d1 [0] e d3 [0] puntano allo stesso '3' nell'heap comunque d2 [0] e d3 [0] non puntano mai allo stesso '3 ' – sactiw