簡(jiǎn)單的理解棧和堆

1. 棧:實(shí)際上就是滿足后進(jìn)先出的性質(zhì),是一種數(shù)據(jù)項(xiàng)按序排列的數(shù)據(jù)結(jié)構(gòu),只能在一端(稱為棧頂(top))對(duì)數(shù)據(jù)項(xiàng)進(jìn)行插入和刪除。


2. 堆:堆是一種完全二叉樹或者近似完全二叉樹,完全二叉樹是效率很高的數(shù)據(jù)結(jié)構(gòu),像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能優(yōu)化。


堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。詳見:十大經(jīng)典排序算法


系統(tǒng)方面的堆和棧

1、棧區(qū)(stack)— 由編譯器自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。

2、堆區(qū)(heap)— 是一個(gè)可動(dòng)態(tài)申請(qǐng)的內(nèi)存空間(其記錄空閑內(nèi)存空間的鏈表由操作系統(tǒng)維護(hù)),在java中,所有使用new xxx()構(gòu)造出來(lái)的對(duì)象都在堆中存儲(chǔ)一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收 。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表。

堆是全局的,堆棧是每個(gè)函數(shù)進(jìn)入的時(shí)候分一小塊,函數(shù)返回的時(shí)候就釋放了,靜態(tài)和全局變量,new得到的變量,都放在堆中,局部變量放在棧中,所以函數(shù)返回,局部變量就全沒了。

我們今天重點(diǎn)講的是Java里的堆和棧也就是系統(tǒng)方面的堆和棧。

Java里的堆、棧和常量池

(下面以圖文的方式講解,方便大家理解)

1. 棧(stack)與堆(heap)都是Java用來(lái)在Ram中存放數(shù)據(jù)的地方。與C++不同,Java自動(dòng)管理?xiàng):投?,程序員不能直接地設(shè)置?;蚨?。

2. 棧的優(yōu)勢(shì)是,存取速度比堆要快,僅次于直接位于CPU中的寄存器。但缺點(diǎn)是,存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。另外,棧數(shù)據(jù)可以共享,詳見第3點(diǎn)。

堆的優(yōu)勢(shì)是可以動(dòng)態(tài)地分配內(nèi)存大小,所有使用new xxx()構(gòu)造出來(lái)的對(duì)象都在堆中存儲(chǔ),生存期也不必事先告訴編譯器,Java的垃圾收集器會(huì)自動(dòng)收走這些不再使用的數(shù)據(jù)。但缺點(diǎn)是,由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。

3. 常量池:存放字符串常量和基本類型常量(public static final)。

常量池的好處是為了避免頻繁的創(chuàng)建和銷毀對(duì)象而影響系統(tǒng)性能,其實(shí)現(xiàn)了對(duì)象的共享。

例如字符串常量池,在編譯階段就把所有的字符串文字放到一個(gè)常量池中。

(1)節(jié)省內(nèi)存空間:常量池中所有相同的字符串常量被合并,只占用一個(gè)空間。

(2)節(jié)省運(yùn)行時(shí)間:比較字符串時(shí),==比equals()快。對(duì)于兩個(gè)引用變量,只用==判斷引用是否相等,也就可以判斷實(shí)際值是否相等。

4. Java中的數(shù)據(jù)類型有兩種。

一種是基本類型(primitive types), 共有8種,即int, short, long, byte, float, double, boolean, char(注意,不包含String)。

如int a = 3; 這里的a是一個(gè)指向int類型的引用,指向3這個(gè)字面值。這些字面值的數(shù)據(jù),由于大小可知,生存期可知(這些字面值固定定義在某個(gè)程序塊里面,程序塊退出后,字段值就消失了),出于追求速度的原因,就存在于棧中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準(zhǔn)確的地方,同時(shí)不同JDK版本的...
    高廣超閱讀 16,040評(píng)論 3 83
  • Java 虛擬機(jī)屏蔽了與具體操作系統(tǒng)平臺(tái)相關(guān)的信息,使得 Java 語(yǔ)言編譯程序只需生成在 Java 虛擬機(jī)上運(yùn)行...
    尋夢(mèng)的尕柳閱讀 919評(píng)論 0 11
  • 前言 不知道大家有沒有這樣一種感覺,程序員的數(shù)量井噴了??赡苁且?yàn)榛ヂ?lián)網(wǎng)火了,也可能是各家培訓(xùn)機(jī)構(gòu)為我們拉來(lái)了大量...
    活這么大就沒飽過(guò)閱讀 2,832評(píng)論 6 25
  • 一、運(yùn)行時(shí)數(shù)據(jù)區(qū)域 Java虛擬機(jī)管理的內(nèi)存包括幾個(gè)運(yùn)行時(shí)數(shù)據(jù)內(nèi)存:方法區(qū)、虛擬機(jī)棧、本地方法棧、堆、程序計(jì)數(shù)器,...
    luhanlin閱讀 602評(píng)論 0 0
  • 國(guó)學(xué)經(jīng)典——道德經(jīng),以前只是隨性聽聽.理解不是很通透。兩周前在組長(zhǎng)的倡導(dǎo)下,我們組好幾個(gè)人,都開始一起來(lái)學(xué)習(xí)道德經(jīng)...
    蜜薛兒閱讀 539評(píng)論 5 5

友情鏈接更多精彩內(nèi)容