1. 程式人生 > >Java中的“堆”,"棧","堆疊","佇列"及其區別(筆記整理)

Java中的“堆”,"棧","堆疊","佇列"及其區別(筆記整理)

4塊記憶體空間
  1.棧記憶體空間:儲存所有的物件名稱(更準確地說是儲存了引用的堆記憶體空間的地址)
  2.堆記憶體空間:儲存每個物件的具體屬性內容。
  3.全域性資料區:儲存static型別的屬性。
  4.全域性程式碼區:儲存所有的方法定義。

Java 把記憶體劃分成兩種:一種是棧記憶體,另一種是堆記憶體。
  在函式中定義的一些基本型別的變數和物件的引用變數都是在函式的棧記憶體中分配,當在一段程式碼塊定義一個變數時,Java 就在棧中為這個變數分配記憶體空間,當超過變數的作用域後,Java 會自動釋放掉為該變數分配的記憶體空間,該記憶體空間可以立即被另作它用。
  堆記憶體用來存放由 new 建立的物件和陣列,在堆中分配的記憶體,由 Java 虛擬機器的自動垃圾回收器來管理。在堆中產生了一個數組或者物件之後,還可以在棧中定義一個特殊的變數,讓棧中的這個變數的取值等於陣列或物件在堆記憶體中的首地址,棧中的這個變數就成了陣列或物件的引用變數,以後就可以在程式中使用棧中的引用變數來訪問堆中的陣列或者物件,引用變數就相當於是為陣列或者物件起的一個名稱。引用變數是普通的變數,定義時在棧中分配,引用變數在程式執行到其作用域之外後被釋放。而陣列和物件本身在堆中分配,即使程式執行到使用 new 產生陣列或者物件的語句所在的程式碼塊之外,陣列和物件本身佔據的記憶體不會被釋放,陣列和物件在沒有引用變數指向它的時候,才變為垃圾,不能在被使用,但仍然佔據記憶體空間不放,在隨後的一個不確定的時間被垃圾回收器收走(釋放掉)。

堆通常是一個可以被看做一棵樹的陣列物件。堆總是滿足下列性質:

  1. 堆中某個節點的值總是不大於或不小於其父節點的值(最大根大根堆/最小根小根堆)
  2. 堆總是一棵完全二叉樹。

②堆是在程式執行時,而不是在程式編譯時,申請某個大小的記憶體空間。即動態分配記憶體,對其訪問和對一般記憶體的訪問沒有區別。
③堆是應用程式在執行的時候請求作業系統分配給自己記憶體,一般是申請/給予的過程。

棧(stack)又名堆疊,線性表。僅允許在表的一端進行插入和刪除運算。這一端為棧頂,另一端為棧底,先進後出。

空間分配

①棧:由作業系統自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。
②堆: 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回收,分配方式類似於連結串列。

快取方式

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

資料結構

①堆:堆可以被看成是一棵樹,如:堆排序。
②棧:一種先進後出的資料結構。

佇列

①佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
②佇列中沒有元素時,稱為空佇列。
③建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,並設定兩個指標進行管理。一個是隊頭指標front,它指向隊頭元素;另一個是隊尾指標rear,它指向下一個入隊元素的儲存位置。
④佇列採用的FIFO(first in first out),新元素(等待進入佇列的元素)總是被插入到連結串列的尾部,而讀取的時候總是從連結串列的頭部開始讀取。每次讀取一個元素,釋放一個元素。所謂的動態建立,動態釋放。因而也不存在溢位等問題。由於連結串列由結構體間接而成,遍歷也方便。(先進先出)

整體區別

①堆是在程式執行時,而不是在程式編譯時,申請某個大小的記憶體空間。即動態分配記憶體,對其訪問和對一般記憶體的訪問沒有區別。
②棧就是一個桶,後放進去的先拿出來,它下面本來有的東西要等它出來之後才能出來。(後進先出)
③佇列只能在隊頭做刪除操作,在隊尾做插入操作.而棧只能在棧頂做插入和刪除操作。(先進先出)
④堆是指程式執行時申請的動態記憶體,而棧只是指一種使用堆的方法(即先進後出)。

1、管理方式不同;
2、空間大小不同;
3、能否產生碎片不同;
4、生長方向不同;
5、分配方式不同;
6、分配效率不同;

相關推薦

Java的“”,"","堆疊","佇列"及其區別筆記整理

4塊記憶體空間   1.棧記憶體空間:儲存所有的物件名稱(更準確地說是儲存了引用的堆記憶體空間的地址)   2.堆記憶體空間:儲存每個物件的具體屬性內容。   3.全域性資料區:儲存static型別的屬性。   4.全域性程式碼區:儲存所有的方法

[轉載]C++引用傳遞與指標傳遞區別進一步整理

這篇文章是在學習了編譯原理引數傳遞後對c++和Java按引用傳遞的不同表現產生疑問,在網上搜索找到的博文,這裡提出了按地址傳遞和按引用傳遞是不同的,按我的個人理解,Java的物件引數的傳遞,是按地址傳遞,而按地址傳遞,需要有一個傳遞到被呼叫函式的指向實

什麼是“”,"","堆疊","佇列",它們的區別

佇列:什麼是佇列?又該怎麼理解呢? ①佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。 ②佇列中沒有元素時,稱為空佇列。 ③建立順序佇列

"" "" "堆疊" "佇列" 區別聯絡 | 資料結構

寫在前面: 三個都是有存取資料的功能,堆的強大之處在於可以存進去一堆數,每次取出這堆數的最小值,而且複雜度時log級別的,所以有一種排序叫做堆排。 棧和佇列一個是頭進頭出,一個是頭進尾出,用佇列可以解決迷宮問題 如果你學過資料結構,就一定會遇到“堆”,"棧","堆疊"

JAVA和內存分配詳解(摘抄)

如果 public china weight 所有 有道 動態 面試題 class 在Java中,有六個不同的地方可以存儲數據: 1.寄存器:最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制. 2. 棧:存放基本類型的變量數據和對象的引用,但對象本身不存放在棧

JAVA和內存分配原理

內存大小 內存分配 tin ati 全限定名 void imm 添加 一個 1、棧、堆 1.寄存器:最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制.2. 棧:存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者

js,佇列區別

棧的定義 棧是電腦科學中的一種抽象資料型別,只允許在有序的線性資料集合的一端(稱為堆疊頂端,英語:top)進行加入資料(英語:push)和移除資料(英語:pop)的運算。因而按照後進先出(LIFO, Last In First Out)的原理運作。 棧的常用操作 棧中有兩個基本的操作 推入 :從棧的頂端推入

Java 覆寫和過載定義與區別 面試題

覆寫和過載 方法的覆蓋(Overriding)和過載(Overloading)是Java多型性的不同表現。覆蓋(也可以叫重寫,覆寫)是父類與子類之間多型性的一種表現,而過載是一個類中多型性的一種表現。 (一)覆寫: 1.方法的覆寫(****重點,Java核心) 定義:子類定義

面試被問之-----sql優化in與exists的區別 Mysql in or exists not exists not in區別 網路整理 Sql語句IN和exists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN

曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進

Java多執行緒---阻塞佇列詳解舉例說明

一. 前言   在新增的Concurrent包中,BlockingQueue很好的解決了多執行緒中,如何高效安全“傳輸”資料的問題。通過這些高效並且執行緒安全的佇列類,為我們快速搭建高質量的多執行緒程式帶來極大的便利。本文詳細介紹了BlockingQueue家庭中的所有成員

Mysql in or exists not exists not in區別 網路整理

in 和or區別:https://www.cnblogs.com/rainwang/p/4389282.html 如果in和or所在列有索引或者主鍵的話,or和in沒啥差別,執行計劃和執行時間都幾乎一樣。 如果in和or所在列沒有 索引的話,效能差別就很大了。在沒有索引的情況下,隨著in或者or後面

Java解析證書檔案的公鑰public key

數字證書的格式遵循X.509標準。X.509是由國際電信聯盟(ITU-T)制定的數字證書標準。證書擴充套件檔名 .cer, .crt - 通常被用於二進位制的DER檔案格式 (同於.der), 不過也被用於Base64編碼的檔案 (例如 .pem).    .P7B - 同於 .p7c   .P7C - P

JAVA時間與字串的相互轉換工具類

<span style="font-size:24px;">//model為字串的時間格式,如"<span style="font-family: arial; line-heigh

java解析上傳的excel檔案xls,xlsx

一、在maven庫中匯入相關依賴 其中poi是解析xls格式的,poi-ooxml是解析xlsx格式的 <!-- POI,excel解析相關 --> <dependency> <groupId>org.apache.poi</g

java Comparable 和Comparator詳解及 區別附程式碼

java中,對集合物件或者陣列物件排序,有兩種實現方式。 即:(1)物件實現Comparable 介面         (2)定義比較器,實現Comparator介面。 下面會簡要介紹這兩種方法的區別,並附上實現程式碼,供大家參考。 Comparable介紹 Compar

Java實現自定義的註解處理器Annotation Processor

在之前的《簡單實現ButterKnife的註解功能》中,使用了執行時的註解實現了通過編寫註解繫結View與xml。由於執行時註解需要在Activity初始化中進行繫結操作,呼叫了大量反射相關程式碼,在介面複雜的情況下,使用這種方法就會嚴重影響Activity初始

Java的建構函式與解構函式筆記1

已Mydate為例: package text1; public class MyDate { int year; int month; int day; //1.建構函式 public MyDate(int y,int m,int d) { year = y; mon

Java常用英語單詞筆記整理

        其實,這些根本不用刻意去記憶,每天都在用,順其自然的就記住了。        但是在學習過程中,變數什麼的一定要使用英文,不會就去查,千萬不要使用,a1,a2,a3.....之類的,或者pinyin。在學習時就要養成好習慣,不然以後寫出的程式碼太low,就算是

Ubuntu下安裝最新OpenJdk1.8以及與jdk1.8的區別網路整理

Linux下的JDK和OpenJDK有什麼具體的區別 大多數LINUX發行版本里,內建或者通過軟體源安裝JDK的話,都是安裝的openjdk. openjdk是jdk的開放原始碼版本,以GPL協議的形式放出。 openjdk只包含最精簡的JDK 在安裝o

java區別

mem 線程 所有 生成 werror 空間 調用 訪問 指向 01,各司其職;         棧內存用來存儲局部變量和方法的調用,         而堆內存用來存儲java中的對象,無論是成員變量,局部變量,還是類變量         他們指向的對象都存儲在堆內存中。