堆,棧,隊列的一些淺薄的理解


一些自己理解的概念

(1)內存:內存是計算機重要的部件之一,任何程序都需要在內存中運行,是與cpu和外部存儲設備數據溝通的橋梁。在計算機運行的過程中,cpu會把內存中的數據進行運算,當運行結束后,cpu會把迅速按結果暫時輸出到內存。所以內存也決定着計算機的穩定運行。

(2)數據結構:數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法索引技術有關。(百度)

(3)常用的數據結構:數組、棧、隊列、堆、鏈表、樹、圖、散列表等。

(4)堆:可以看作是一個完全二叉樹(若設二叉樹的深度為h,除第 h 層外,其它各層 (1h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。)堆要在程序運行時動態分配內存,存取速度較慢。

String str1= "abc" ;
String str2= "abc" ;
JVM創建了兩個引用str1和str2,但只創建了一個對象,而且兩個引用都指向了這個對象
堆先進先出

下面用過數組來模擬下(完全二叉樹)

 

(5)棧:棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。(百度)

棧是后進先出

(6)隊列:隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。

隊列先進先出

(7)內存中的堆內存和占內存(切記不是數據結構中的堆和棧

堆內存棧內存空間分配

棧(操作系統):由操作系統自動分配釋放 ,存放函數的 參數值局部變量的值等。其操作方式類似於數據結構中的棧。
堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。
 

堆內存棧內存緩存方式

棧使用的是 一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放。
堆則是存放在 二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。
 

堆內存棧內存申請效率的比較

:由系統自動分配,速度較快。但程序員是無法控制的。

:是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便。

 

堆內存棧內存生成時間的比較

棧:在編譯時確定的,不是在運行時.

堆:在運行時確定的,不是在編譯時.

堆內存棧內存存儲java數據類型的比較

棧:int, short, long, byte, float, double, boolean, char等基本類型 和對象的引用(比如 Car car =new Car()中Car car為對象的引用 ,而 new Car()是實際對象,存在於堆中)。

堆:包裝類和真實的對象(String 類型也存在於堆內存)

 

以上是本人對堆,棧,隊列的一些淺薄理解,如果有錯誤,歡迎大家在留言指正,相互學習,共同進步!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM