一、堆內(nèi)存和數(shù)據(jù)結(jié)構(gòu)堆之間的關(guān)系
數(shù)據(jù)結(jié)構(gòu)中的堆和內(nèi)存中的堆是兩個(gè)完全不同的概念。它們除了名字一樣沒(méi)有什么必然的聯(lián)系。就跟蘋(píng)果一樣,一個(gè)是水果一個(gè)是品牌。前者是組織數(shù)據(jù)的一種手段(或者叫工具),后者只是指明數(shù)據(jù)存儲(chǔ)在哪種內(nèi)存區(qū)之上。
1、內(nèi)存堆棧
內(nèi)存管理中的堆棧,其實(shí)應(yīng)該分為“堆heap”和“棧stack”兩個(gè)部分,即heap采用了堆的數(shù)據(jù)結(jié)構(gòu),棧采用了棧的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存管理中發(fā)揮不同的作用。
以變量存儲(chǔ)為例:
變量的引用存儲(chǔ)在棧區(qū)中
該引用所指向的變量的值則存儲(chǔ)在堆區(qū)中
2、數(shù)據(jù)結(jié)構(gòu)堆棧
數(shù)據(jù)結(jié)構(gòu)中的stack我們叫做堆棧,其實(shí)是兩種不同的數(shù)據(jù)結(jié)構(gòu),即堆和棧,堆實(shí)質(zhì)上是滿(mǎn)足一定性質(zhì)的完全二叉樹(shù),而棧是“后進(jìn)先出”的一種線(xiàn)性數(shù)據(jù)結(jié)構(gòu),它們與隊(duì)列queue數(shù)據(jù)結(jié)構(gòu)相對(duì),queue是先進(jìn)先出的線(xiàn)性數(shù)據(jù)結(jié)構(gòu),它們都是數(shù)據(jù)結(jié)構(gòu)中的概念,或者可以叫做邏輯技術(shù),與平臺(tái),語(yǔ)言等無(wú)關(guān);
3、堆棧空間分配區(qū)別
棧(操作系統(tǒng)):由操作系統(tǒng)自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧;
堆(操作系統(tǒng)): 一般由程序員分配(申請(qǐng)一塊內(nèi)存空間)釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收,分配方式倒是類(lèi)似于鏈表。
4、堆棧緩存方式區(qū)別
棧使用的是一級(jí)緩存, 他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放;
堆是存放在二級(jí)緩存中,生命周期由虛擬機(jī)的垃圾回收算法來(lái)決定(并不是一旦成為孤兒對(duì)象就能被回收)。所以調(diào)用這些對(duì)象的速度要相對(duì)來(lái)得低一些。
5、堆棧數(shù)據(jù)結(jié)構(gòu)區(qū)別
堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹(shù),如:堆排序;
棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。