java程式設計——JAVA 中的棧與堆
簡介
JAVA在程式執行時,在記憶體中劃分5片空間進行資料的儲存。分別是:
- 暫存器。
- 本地方法區。
- 方法區。
- 棧。
- 堆。
棧stack和堆heap這兩個概念很重要
棧:
- 函式中定義的基本型別變數,物件的引用變數都在函式的棧記憶體中分配。
- 棧記憶體特點,數資料一執行完畢,變數會立即釋放,節約記憶體空間。
- 棧記憶體中的資料,沒有預設初始化值,需要手動設定。
堆:
- 堆記憶體用來存放new建立的物件和陣列。
- 堆記憶體中所有的實體都有記憶體地址值。
- 堆記憶體中的實體是用來封裝資料的,這些資料都有預設初始化值。
- 堆記憶體中的實體不再被指向時,JVM啟動垃圾回收機制,自動清除,這也是JAVA優於C++的表現之一(C++中需要程式設計師手動清除)。
示例1
main()
int x=1;
show ()
int x=2
主函式main()中定義變數int x=1,show()函式中定義變數int x=1。最後show()函式執行完畢。
小編是一個有著5年工作經驗的java程式設計師,對於java,自己有做資料的整合,一個完整學習java的路線,學習資料和工具,相信這裡有很多學習java的小夥伴,我創立了一個2000人學習扣群,479121291。每晚都有java的直播課程。無論是初級還是進階的小夥伴小編我都歡迎!
以上程式執行步驟:
第1步——main()函式是程式入口,JVM先執行,在棧記憶體中開闢一個空間,存放int型別變數x,同時附值1。
第2步——JVM執行show()函式,在棧記憶體中又開闢一個新的空間,存放int型別變數x,同時附值2。此時main空間與show空間並存,同時執行,互不影響。
第3步——show()執行完畢,變數x立即釋放,空間消失。但是main()函式空間仍存在,main中的變數x仍然存在,不受影響。
示意圖:
示例2
main()
int[] x=new int[3];
x[0]=20
主函式main()中定義陣列x,元素型別int,元素個數3。
第1步——執行int[] x=new int[3];
JVM執行main()函式,在棧記憶體中開闢一個空間,存放x變數(x變數是區域性變數)。同時,在堆記憶體中也開闢一個空間,存放new int[3]陣列,堆記憶體會自動記憶體首地址值,如0x0045。
陣列在棧記憶體中的地址值,會附給x,這樣x也有地址值。所以,x就指向(引用)了這個陣列。此時,所有元素均未附值,但都有預設初始化值0。
第2步——執行x[0]=20 即在堆記憶體中將20附給[0]這個陣列元素。這樣,陣列的三個元素值分別為20,0,0
示意圖:
示例3
Car c=new Car;
c.num=5;
Car c1=c;
c1.color="green";
c.run();
Car c1=c,這句話相當於將物件複製一份出來,兩個物件的記憶體地址值一樣。所以指向同一個實體,對c1的屬性修改,相當於c的屬性也改了。
示意圖: