我們愛面試,一面一學-----JAVA堆、棧
爛俗的問題往往是最容易問到的問題,想必諸多面友都深有體會,因為我們和我們的面試官們都是俗人。但從另一方面來說,爛俗往往有著廣闊的延伸空間,一次次讓爛俗震驚你,不然于丹老師也就發不了財了。
言歸正傳,關于堆、棧真的很豐富、很值得研究。了解的不深,暫且按照個人的理解、思路來做筆記。
1---定義。堆、棧都是內存中的數據區,JVM用來存放程序中的數據,當然程序員是不可以直接操作這兩個區(都是由JVM操作的,包括new一個對象和垃圾對象回收)。
2---區別。(1):棧中的數據存取速度要比堆中的快許多,據說僅次于CPU中的寄存器(這是不重要的一條)。
(2):棧中的數據是共享的(這點不重要,但是很麻煩,尤其是對理解String的存放重要)。
(3):棧中的數據大小、生存周期必須是固定的(這點也不是很重要)。
(4):棧中存放基礎類型變量(byte、short、int、long、float、double、boolean、char),堆中存放引用類型變量(類、數組、枚舉、接口)。這條是籠統、概述性質的,不完全正確。
下面具體描述、解釋以上4條。
第一條。關于存取速度,不是很重要,了解就可以,沒想到什么辦法可以測定一下。這個應該是對內存區的分配問題,沒能力詳細敘述了。
第二條。棧中的數據是共享的。這種問題得舉例來說了。例如一段代碼
- int a = 1;
- int b =1;
- b = 2;
第三條。棧中的數據大小、生存周期都是已知的。如果在某個函數中聲明了基礎類型變量,則在函數調用結束的時候變量生存周期結束,即生存周期已知。
第四條。關于什么類型的變量存放在哪時最常問的問題。首先8中基礎類型變量毫無疑問的會存放在棧中。其次自己定義的類對象也都會存放在堆中。最后有幾種比較特殊的變量需要詳細解釋。
(1)String類型。首先,如果用String str = new String("asdf");來新建對象,會毫無疑問的存入堆中。但如果使用String str = "asdf",來聲明變量則會放入棧中,并遵守棧中數據共享的原則。例如以下代碼。
- String a = "abc";
- String b = "abc";
- b = "cde";
(2)數組。因為數組是繼承了超類object,所以也要看做對象,即也要存放在堆中。
(3)枚舉。同上。
還需要澄清的一點是,當聲明、初始化了對象之后,對象的內容的確存放在了堆中,但對象的引用是存放在棧中的
個人網站 www.software8.co