初學者對java陣列中棧和堆的認識
阿新 • • 發佈:2018-12-30
public static void main(String[] args) {
String[] Array = null;
Array = new String[3];
Array[0] = "安徽合肥";
Array[1] = "江蘇蘇州";
Array[2] = "安徽銅陵";
for(int i=0;i<=2;i++){
System.out.println(Array[i]);
}
}
以上程式碼是對陣列簡單的宣告及記憶體分配的小例項,簡單的實現了陣列的應用。接下來想和大家分享的是陣列在記憶體中的存放形式,以及在陣列中棧和堆的關係。首先給出結論:陣列引用變數(即Array變數)是存放在棧記憶體中,陣列元素(即Array[0]、Array[1]等元素)是存放在堆記憶體中,通過棧記憶體中的指標指向對應元素的在堆記憶體中的位置來實現訪問,以下圖來說明陣列此時的存放形式。
在java中,當執行方法時,該方法都會建立自身的記憶體棧,以用來將該方法內部定義的變數逐個加入到記憶體棧中,當執行結束時方法的記憶體棧也隨之銷燬,所有變數存放在棧記憶體中,即隨著寄存主體的消亡而消亡;反之,當我們建立一個物件時,這個物件被儲存到執行時資料區中,即存放在堆空間中,以便反覆利用(因為建立成本很高),此時不會隨著執行方法的結束而消亡,同時該物件還可被其他物件所引用,只有當這個物件沒有被任何引用變數引用時,才會在垃圾回收在合適的時間點回收。