2013-05-16 61 views
8

我做了一些研究,我跨越,要求以顯示下面的代碼的正確記憶圖中的問題就來了:哪一個去堆棧或堆?

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

這是我在記憶圖的嘗試,但它可能是不正確的:

enter image description here

我理解一些對象,實例變量,和「新」的情況下,都在堆和東西,如局部變量和基本類型是在棧中,但我仍然感到困惑,當涉及到數組類型。

任何幫助表示讚賞。

+0

數組是在端部的'Object'(甚至基元的陣列)。順便說一下,你接近最終答案。 –

+0

@LuiggiMendoza我改變了我的圖。這是否是正確的答案? – blutuu

+2

幾乎JVM維護一個'Integer'對象的池,從-128到127.所以對於'd2'數組和'd3' ArrayList,值爲3的'Integer'將是相同的。 –

回答

5

Java上的任何對象都生活在堆上。

在Java數組中也是一個對象,因此數組Object也存在於堆中。

闡釋: -

當編寫

int a=new int[5], 

(新INT [5])的一部分創建對象,因此住在堆。

Integer x=new Integer(10000) 

也是一個對象(記住新的操作符總是會創建新的對象)。

,因此當你賴特,

Integer [] d2 = new Integer[5]; 

是Integer對象的數組。

至於ArrayList的被認爲這也是一個類,但它包裝陣列對象,並增加了動態存儲器到它。 因此,

ArrayList d3 = new ArrayList(); 

再次創建對象,因此生活在堆上。

考慮ArrayList類爲:

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 
} 

所以,當你寫 d3.add(5)實際上d3.add(新的整數(5))被調用。

記住一個黃金法則: 在創建現場直播HEAP及其對堆棧活引用任何Java對象的。

陣列是對象的證明: -

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

//輸出真

+0

不錯。感謝您的解釋。我覺得我現在有一個正確的圖。你看到有什麼問題嗎? – blutuu

+0

圖中沒有問題,它的完美老兄!!!!!!! – WebServer

+0

感謝您的反饋。 – blutuu

0

數組不能Java原始它在Java的具體類。

數組是保存的 單一類型的值的固定數目的容器對象。數組長度爲 時創建的數組長度。

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

所以,當你創建任何陣列的對象類型,必須去你的堆空間。

+0

噢好吧。我看到'int'並且認爲這個數組是原始的。 – blutuu

+0

thery不在java中。 :) –

+0

哎呀。我明白。 – blutuu

0

這裏是一個替換的,正確的存儲器示圖。

+0

該內存圖仍然不正確,因此如果在堆中d1 [0]和d3 [0]指向相同的'3',但是d2 [0]和d3 [0]永遠不會指向相同的'3 「 – sactiw