區別:1、堆疊(heap)的空間一般由程式設計師分配釋放;而堆疊(stack)的空間由作業系統自動分配釋放 。 2、heap是存放在二級快取中,生命週期由虛擬機器的垃圾回收演算法決定;而stack使用的是一級緩存,通常都是被呼叫時處於儲存空間中,調用完畢立即釋放。 3.資料結構不同,heap可以被看成是一棵樹,而stack是一種先進後出的資料結構。
本教學操作環境:windows7系統、java8版、DELL G3電腦。
堆疊是兩種資料結構。堆疊都是一種資料項依序排列的資料結構,只能在一端(稱為棧頂(top))對資料項進行插入和刪除。在單晶片應用中,堆疊是個特殊的儲存區,主要功能是暫時存放資料和位址,通常用來保護斷點和現場。重點:堆,隊列優先,先進先出(FIFO—first in first out)。棧,先進後出(FILO—First-In/Last-Out)。
一、堆疊空間分配差異:
1、堆疊(作業系統) :由作業系統自動分配釋放,存放函數的參數值,局部變數的值等。其操作方式類似資料結構中的堆疊;
2、堆疊(作業系統): 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回收,則分配方式倒是類似於鍊錶。
二、堆疊快取方式區別:
1、堆疊使用的是一級緩存, 他們通常都是被呼叫時處於儲存空間中,調用完畢立即釋放;
2、堆是存放在二級快取中,生命週期由虛擬機器的垃圾回收演算法來決定(並不是一旦成為孤兒物件就能被回收)。所以呼叫這些物件的速度要相對來得低一些。
三、堆疊資料結構區別:
堆(資料結構):堆疊可以被看成是一棵樹,如:堆排序;
Java中堆疊和堆疊:
棧(stack)與堆疊(heap)都是Java用來在Ram中存放資料的地方。與C 不同,Java自動管理堆疊和堆,程式設計師不能直接設定棧或堆。
在函數中定義的一些基本類型的變數和物件的參考變數都在函數的堆疊記憶體中分配。當在一段程式碼區塊定義變數時,Java就在堆疊中為這個變數分配記憶體空間,當超過變數的作用域後,Java會自動釋放掉為該變數所分配的記憶體空間,該記憶體空間可以立即被另作他用。 ### 堆內存用來存放由new創建的物件和數組,在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。在堆中產生了一個數組或物件後,還可以在棧中定義一個特殊的變量,讓棧中這個變量的取值等於數組或對像在堆內存中的首地址,棧中的這個變量就成了數組或物件的引用變數。引用變數就等於是為數組或物件起的名稱,以後就可以在程式中使用堆疊中的引用變數來存取堆疊中的陣列或物件。 #########Java中變數在記憶體中的分配###: ###### 1、類別變數(static修飾的變數):在程式載入時系統就為它在堆疊中開啟了內存,堆中的內存地址存放於棧以便於高速訪問。靜態變數的生命週期–一直持續到整個」系統」關閉。 ###### 2、實例變數:當你使用java關鍵字new的時候,系統在堆中開闢並不一定是連續的空間分配給變數(比如說類別實例),然後根據零散的堆記憶體位址,透過哈希演算法換算為一長串數字以表徵這個變數在堆中的」物理位置」。實例變數的生命週期–當實例變數的引用遺失後,將被GC(垃圾回收器)列入可回收「名單」中,但並不是馬上就釋放堆中記憶體。 ###### 3、局部變量:局部變量,由聲明在某方法,或某程式碼段裡(比如for循環),執行到它的時候在棧中開闢內存,當局部變量一但脫離作用域,記憶體立即釋放。 ######這裡要牽涉到Java記憶體問題,可以參考:###Java的記憶體機制#########推薦教學:《###java教學###》###以上是heap和stack有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!