1. 程式人生 > >(基礎篇)淺析JAVA中的棧和堆

(基礎篇)淺析JAVA中的棧和堆

分享圖片 不可 img alt 插入 EDA 先進後出 我不 新的

若為生活所迫,做了自己不喜歡做的事。卻沒有達到自己預期想要的結果,那麽何必強迫自己,苦惱這一世。不如轉而做自己喜歡的事,哪怕像我一樣從頭開始。
技術分享圖片

一、概念

【老生常談】
對於剛接觸計算機,沒幾年的我來說,好多老生常談的概念對我而言都很新鮮。下面的概念也不例外。
他們說對學計算機的而言,堆棧是一個不容忽視的概念。
1、堆棧是兩種數據結構,只能在一端對數據項進行插入和刪除。
2、在單片機應用中,堆棧是個特殊的存儲區,主要是暫時存放數據和地址。
3、堆,隊列優先,先進先出
4、棧,先進後出
【java中堆棧的概念】
【比較】
1、棧(stack)與堆(heap)都是java用來在內存中存放數據的地方。

2、java自動管理棧堆,程序員不需要理會(與C++不同)。
3、棧,存儲速度比堆快,僅次於CPU中的寄存器。缺點是,大小和生命周期是確定的缺少靈活性。
4、棧數據在多線程或者多個棧之間是不可以共享的
5、棧內部的多個值相等的變量是可以指向同一個地址的。
6、堆的優勢可以動態的分布內存的大小,生命周期也是動態的。
7、java垃圾收集器會自動的收走不在使用的堆數據。
8、堆缺點是,要在運行時動態分配內存,存取速度較慢。

二、java中的數據類型

1、基本類型,8種:int、short、 long、 byte、 float、 double、 boolean、 char
例如:int Red_Ant = 1024;這裏的Red_Ant是一個指向int類型的引用,這類值就存在於棧中。(這點讓筆者想起了,有一次冒冒失失的聽了一節C++關於指針的課程,當時沒聽懂,以後就沒去。損失啊,這裏的棧的概念感覺好相似)。

2、包裝類數據:Integer、String、 Double等將相應的基本數據類型包裝起來的類。這些類數據全部存在於【堆】中】,Java用new()語句來明顯的告訴編譯器,在運行時再動態創建,因此比較靈活,但缺點是要占用更多的時間。
【attention】
String是一個特殊的包裝類數據。
即可以用String redant = new String("Red_Ant");的形式來創建,
也可以用String str = "abc";的形式來創建。
這一塊呢,jdk對String類型的數據做了好多的處理,是因為用的多嗎。
為了說明問題,筆者做了一個測試

技術分享圖片

結果:

技術分享圖片

【說明】
兩個引用都指向了同一個對象,依據jdk的說明過程是這樣的:
在棧中查找有沒有存放值為"red_ant"的地址,如果沒有,則開辟一個這個地址。然後hoyl對象和studio對象,都引用這個地址當然是同一個對象了。
【聯想頗多】
是不是可以理解為:一個皇帝有兩個老婆,大老婆稱皇帝為陛下,小老婆稱皇帝為大王。然,只是稱謂不同,實際上不都指的一個人嗎),所以這倆就相等了。

【為了驗證】

技術分享圖片

技術分享圖片

【這又說明了啥】

還是那個類似的比方,春秋戰國,所謂齊楚秦燕趙魏韓,自不必多說。他們都有一個大王,然而大王和大王相比自然是不同的。new 相當於開辟了一個新的空間,原來的那個我不用也不認了。new幾個就會形成幾個,雖然內容是相同的,但是地址不一樣,也不是同一個對象。

(基礎篇)淺析JAVA中的棧和堆