堆(heap)
- 堆通常是一個可以被看做一棵樹的數組對象。堆總是滿足下列性質:
- 堆中某個節點的值總是不大於或不小於其父節點的值;
- 堆總是一棵完全二叉樹。
根節點最大的堆叫做最大堆、大根堆或大頂堆
根節點最小的堆叫做最小堆、小根堆或小頂堆
常見的堆還有二叉堆、斐波那契堆等。 堆是在程序運行時,而不是在程序編譯時,申請某個大小的內存空間。即 動態分配內存,對其訪問和對一般內存的訪問沒有區別。
堆是應用程序在運行的時候請求操作系統分配給自己內存,一般是申請/給予的過程。
堆是指程序運行時申請的動態內存,而棧只是指一種使用堆的方法(即 先進后出)。
棧(stack)
棧又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。
棧就是一個桶,后放進去的先拿出來,它下面本來有的東西要等它出來之后才能出來(先進后出)
棧是操作系統在建立某個進程時或者線程(在支持多線程的操作系統中是線程)為這個線程建立的存儲區域,該區域具有FILO(First In Last Out)的特性,在編譯的時候可以指定需要的Stack的大小。
區別
- 空間分配
- 堆(操作系統):一般由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。
- 棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。
- 緩存方式
- 堆:存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。
- 棧:使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放。
- 數據結構
- 堆(數據結構):堆可以被看成是一棵樹,如:堆排序。
- 棧(數據結構):一種先進后出,后進先出的數據結構。
- 存取方式
- 堆:隨意存取。常用來實現優先隊列,先進先出。這就如同我們在圖書館的書架上取書,我們可以直接取出我們想要的書
- 棧:先進后出,后進先出。這就如同我們要取出放在箱子里面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)
- 存儲方式
- 堆:從低地址寫到高地址,是不連續的內存區域,如int數組{1, 2, 3 ,4, 5},存儲地址則依次為0, 4, 8, 12, 16
- 棧:從高地址寫到低地址,是一段連續的內存區域,如存儲數據1234,存儲地址則依次為高地址12,低地址34
其實也很好理解,讀取數據從高位到低位順着讀入進去,運算時卻是從低位到高位運算,所以棧從高地址寫到低地址,而從低地址到高地址讀出。
如圖: