2013-05-16 20 views
8

Robię niektóre badania i natknąłem się na pytanie, które prosi, aby pokazać prawidłową schemat pamięci następującego kodu:Co dzieje się na stosie lub sterty?

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); 

Oto moja próba na diagramie pamięci, ale może być nieprawidłowe:

enter image description here

rozumiem rzeczy jak obiektów, zmiennych instancji, a „nowe” przypadki są na stercie i rzeczy takie jak zmienne lokalne i prymitywnych typów są na stosie, ale nadal jestem zdezorientowany, jeśli chodzi o typy tablic.

Każda pomoc jest doceniana.

+0

Tablica jest w końcu ma 'Object' (nawet tablicy z pierwotnych). Przy okazji, jesteś blisko ostatecznej odpowiedzi. –

+0

@LuiggiMendoza Zmieniłem swój diagram. Czy to była poprawna odpowiedź? – blutuu

+2

Prawie JVM utrzymuje pulę dla obiektów "Integer" od -128 do 127. Tak więc wartość 'Integer' z wartością 3 będzie taka sama dla obu tablic' d2' i 'd3' ArrayList. –

Odpowiedz

5

Każdy obiekt na Javie żyje na stercie.

W języku Java Array jest również obiektem, a tym samym obiekt tablicy żyje na stercie.

wyjaśnieniu: -

Kiedy piszesz

int a=new int[5], 

The (new int [5]), część tworzy obiekt i stąd mieszka na stercie.

Integer x=new Integer(10000) 

to także obiekt (pamiętaj, że nowy operator zawsze utworzy nowy obiekt).

a więc gdy Wright,

Integer [] d2 = new Integer[5]; 

jest Array of Integer Object.

Jeśli chodzi o ArrayList, jest to również klasa, ale opakowuje obiekt tablicy i dodaje do niego pamięć dynamiczną. Tak,

ArrayList d3 = new ArrayList(); 

ponownie tworzy Obiekt, a więc żyją na stercie.

Rozważmy ArrayList klasy jako:

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 
} 

więc kiedy piszesz d3.add (5) faktycznie d3.add (new Integer (5)) jest wywoływana.

Zapamiętaj jedną złotą zasadę: W java, niezależnie od tego, jaki obiekt tworzysz na żywo na HEAP, a ich odnośnik jest na żywo.

Dowód zespołu są obiektu: -

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

// wyświetla prawdziwe

+0

Nice. Dziękuję za wyjaśnienie. Czuję, że mam teraz prawidłowy schemat. Czy widzisz coś złego w tym? – blutuu

+0

nie ma problemu w schemacie, to idealny koleś !!!!!!! – WebServer

+0

Dzięki za opinię. – blutuu

0

Tablice nie są prymitywne w java ma konkretną klasę w języku Java.

Tablica jest przedmiotem pojemnik, który posiada stałą liczbę wartości jednego typu. Długość tablicy jest ustalana po utworzeniu tablicy .

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

podczas tworzenia wynikowego dowolnych macierzy A więc wpisz to musi iść do ciebie kupa miejsca.

+0

Oh okej. Widziałem "int" i uznałem, że tablica jest prymitywna. – blutuu

+0

thery nie są w języku Java. :) –

+0

Gotcha. Rozumiem. – blutuu

0

Oto alternatywne, prawidłowe schemat pamięci.

+0

ten schemat pamięci jest nadal niepoprawny, więc jeśli w ogóle byłby to d1 [0], a d3 [0] wskazywałoby na to samo '3' w stercie, jednak d2 [0] i d3 [0] nigdy nie wskażą tego samego '3 " – sactiw

Powiązane problemy