最近看了幾篇關於java堆和棧的區別的幾個文章。自己對這兩個概念有了一定
了理解。
其實java的堆和棧是一種記憶體資源。這裡提到了記憶體資源,順便說一
下其實java記憶體不僅僅是棧和堆。還有寄存器,常量池。
java堆記憶體是一個運行時資料區域,可以動態分配記憶體的大小,生存
周期不必實現告訴編譯器,存放對象和數組,優點是動態分配具有靈活性,缺
點是存取慢。
java棧記憶體是一個資料可共用的地區,棧中資料的大小和生存周期是
確定的。棧中存放的一般是一些基本變數和物件控點。缺乏靈活性,存取快。
其實我感覺自己這兩句話的總結應付一些面試題是沒問題的。比如說
string str1=new string(“fish”);new出的是對象,自然在堆。
string str2=“fish” 是一個變數的引用會存在棧中。所以很明顯str1!
=str2。若str3=“fish”。他也是在棧中而且棧中資料共用所以str2==str3.再
說string str4= new string(“fish”) ;雖然str4和str1都是建立對象在
堆中。但是我沒說過堆中資料共用所以,所以他們只是值相同,但是str1!
=str4在字串中equals方法我把他理解是比較數值是否相等。所以這樣很好理
解這三個值都是一樣的所以相等。
說到str1!=str4,我想到一個問題就是因為他們是兩個獨立的對象,有各
自生命週期。所以他們生命週期是不確定的,因為運行調用而建立,不用而消
亡。所以會被GC自動回收(java的記憶體回收行程)。所以堆中的資料可以通過GC
自動回收,如果不能回收,會可能出現記憶體溢出,一般記憶體溢出可能是短生命
周期的變數用長生命週期定義導致資料在記憶體不用,卻佔據記憶體資源,所以也
可以自己手動回收。
如果是new的對象,說明他的生命週期因為運行而生,不用而亡。說明這樣可以
提高記憶體效率,不必總是霸佔資源。所以現在我們可以知道string str=new
string(“”);比string str=“”;要好。