大概三四個月前
準備面試時補習班老師給了我這個連結
http://www.importnew.com/27326.html
我試著爬文找答案
雖然沒完成但總之也整理了一些資訊
先從 stack 跟 heap 開始...
stack:
1.stack在記憶體中用來存放可以預測生命週期的資料
以便作業系統管理,
可以想成一層一層堆起來的盒子裡面會存放數值型別的變數或是引用,
當變數生命週期結束盒子就會被移走
2.如果管理的不好會產生stackoverflow
3.生命週期在scope內{ 這裡面 }也就是說跑到底就結束
heap
1.可動態申請之內存空間
2.java中new XXX() 物件全部會放到heap中
一旦garbage collection system偵測到某對象沒被引用就會銷毀此物件
3.可想成在某個公園擺放得一團亂的盒子
物件參照會放到stack中的某個盒子,相對應的物件實體會放到公園中的某個空盒子
當物件實體生命週期結束,不再被引用,
就會被系統標註沒人使用最後再把它刪除
比較:
1.stack
優勢:存取速度比heap還快
缺點: stack 中存的 數據大小 生命週期 都要固定 缺乏靈活性
2.heap
優勢:動態分配內存大小,生命週期不用告訴編譯器
缺點:運行時要動態分配內存所以運行速度較慢
3.stack與heap一樣
在java都是程式自動管理無法自行設定stack或是heap
4.stack存八大基本資料:
int, short, long, byte, float, double, boolean, char
數據還可共享
比如 int a=3; int b =3;
此時
系統會先在 stack 創立 reference (參照類型) a 然後找有沒有字面值為3的地址
沒有的話
會自己創一個再將a指向它
接著創造 reference b ,看到有字面值3的地址就指向它
改b = 4也不會刪掉3這個字面值,系統會新增一個4的字面值在stack然後再讓b指向它
5.wrapper 會將資料存在 heap
但 String 比較特殊
String a = "abc"; String b="abc";
String c = new String("abc"); String d = new String("abc");
這樣的情況下
a==b 成立,會在 stack 共用 abc
c==d 就不成立,因為兩者都會各新增一個實例再讓 reference 指向它們
6.Integer i = 3 底層會轉為 Integer i = new Integer(3)
這點跟String不一樣
P.S
資料參考以下連結:
http://619lucky.blogspot.tw/2010/09/java-stack-and-heap.html
原作者如果希望刪除這篇文章請告知,謝謝;)