⑴ java 堆棧 裡面存的都是些什麼
在函數中定義的一些基本類型的變數和對象的引用變數都是在函數的棧內存中分配。當在一段代碼塊中定義一個變數時,java就在棧中為這個變數分配內存空間,當超過變數的作用域後,java會自動釋放掉為該變數分配的內存空間,該內存空間可以立刻被另作他用。
堆內存用於存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。在堆中產生了一個數組或者對象後,還可以在棧中定義一個特殊的變數,這個變數的取值等於數組或者對象在堆內存中的首地址,在棧中的這個特殊的變數就變成了數組或者對象的引用變數,以後就可以在程序中使用棧內存中的引用變數來訪問堆中的數組或者對象,引用變數相當於為數組或者對象起的一個別名,或者代號。
引用變數是普通變數,定義時在棧中分配內存,引用變數在程序運行到作用域外釋放。而數組&對象本身在堆中分配,即使程序運行到使用new產生數組和對象的語句所在地代碼塊之外,數組和對象本身佔用的堆內存也不會被釋放,數組和對象在沒有引用變數指向它的時候,才變成垃圾,不能再被使用,但是仍然占著內存,在隨後的一個不確定的時間被垃圾回收器釋放掉。這個也是java比較占內存的主要原因,實際上,棧中的變數指向堆內存中的變數,這就是 Java 中的指針!
⑵ 什麼是堆棧及堆棧的作用是什麼
在計算機領域,堆棧是一個不容忽視的概念,堆棧是兩種數據結構。堆棧都是一種數據項按序排列的數據結構,只能在一端(稱為棧頂(top))對數據項進行插入和刪除。在單片機應用中,堆棧是個特殊的存儲區,主要功能是暫時存放數據和地址,通常用來保護斷點和現場。要點:堆,隊列優先,先進先出 。棧,先進後出(First-In/Last-Out)。
1. 棧(stack)與堆(heap)都是Java用來在Ram中存放數據的地方。與C++不同,Java自動管理棧和堆,程序員不能直接地設置棧或堆。
2. 棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的寄存器。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。另外,棧數據可以共享,詳見第3點。堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由於要在運行時動態分配內存,存取速度較慢。
3.Java中的數據類型有兩種。
一種是基本類型(primitivetypes), 共有8種,即int,short, long, byte, float, double, boolean, char(注意,並沒有string的基本類型)。這種類型的定義是通過諸如int a= 3; long b = 255L;的形式來定義的,稱為自動變數。值得注意的是,自動變數存的是字面值,不是類的實例,即不是類的引用,這里並沒有類的存在。如int a= 3; 這里的a是一個指向int類型的引用,指向3這個字面值。這些字面值的數據,由於大小可知,生存期可知(這些字面值固定定義在某個程序塊裡面,程序塊退出後,欄位值就消失了),出於追求速度的原因,就存在於棧中。
⑶ 什麼叫堆棧
堆棧其實是數據結果中的兩個概念 ,是存放數據的方式。
堆:順序隨意。
棧:後進先出(Last-In/First-Out)。
要說用處,那就是在寫代碼的時候,有時數據存取肯定是要有規定的順序的,這個是你自己規定的,然後按照你所寫程序的用處的特點來用堆還是棧還是隊列之類的順序。
如果我的回答幫到了你,請點「採納」。
⑷ 堆棧是什麼意思
類似於隊列,堆棧是個簡單的數據存儲結構。堆棧中數據進出的順序很重要,舉個例子,餐廳的盤子堆,盤子洗完要堆到上面,而不是插到下面的某個位置(相信不會有人那麼做)。當廚師要用到盤子時從最上面的開始拿。即最先放在堆里的盤子會被最後一個用到。
定義:堆棧就是只能在一端插入和刪除數據的鏈表,這個端就叫做棧頂(top),最後一個添加的數據第一個被刪除。因此,這也叫後進先出(LAST IN FIRST OUT)鏈表或是先進後出鏈表(FIRST IN LAST OUT)。
對於堆棧有兩種操作:
進棧指令(PUSH):在棧中現有元素頂部添加一個元素,新加入的元素變為最頂端的元素。
出棧指令(POP):取出棧頂元素,刪除棧中的這個元素。
有些情況下,棧的最大長度有限。如果棧中元素已經達到最大長度,再用進棧指令會造成堆棧上溢出(stack overflow),相似的,如果堆棧已空還用出棧指令會造成堆棧下溢出(stack underflow)。
⑸ 簡述什麼是堆棧,以及堆棧中入棧,出棧的過程
堆棧其實是兩種數據結構。堆棧都是一種數據項按序排列的數據結構,只能在一端
(稱為棧頂(top))
對數據項進行插入和刪除。要點:堆,順序隨意。棧,後進先出(Last-In/First-Out)。
針對棧這種數據結構的基本操作有兩種:壓棧和彈出,
在棧幀中包含兩個標志----棧底和棧頂,其中棧頂標識著要push或pop
的數據的地址,而棧底則表示棧幀中最後一個數據的內存地址。
在Win32中,寄存器esp存放著棧底指針,棧是向低地址方向生長,
因此esp指向棧頂元素
堆棧對比(操作系統):
由編譯器自動分配釋放,存放函數的參數值,局部變數的值等。其
操作方式類似於數據結構中的棧棧使用的是一級緩存,
通常都是被調用時處於存儲空間中,調用完畢立即釋放
堆(操作系統):
一般由程序員分配釋放,
若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。
堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收演算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些
堆(數據結構)
:堆可以被看成是一棵樹,如:堆排序
棧(數據結構)
:一種後進先出的的數據結構
具體不同語言有不同的描述,可查看各種語言的api
⑹ java 堆棧 裡面存的都是些什麼
棧裡面存放到主要是基本數據類型的局部變數和對象的引用(指向對象一種類似地址的東西)。
堆內存主要存放new出來的對象(包括數組)。
其實Java的內存結構不光包括棧和堆,還包括代碼區(載入class類文件本身)、數據區之類的。
⑺ 「堆棧」指的是什麼
堆棧
堆棧又稱為棧,也是線性數據結構,並且是遵循「後進先出」(LIFO)原則的重要線性數據結構。在Java中,Stack是java.util包中專門用來實現棧的工具類。
棧只能在一端輸入輸出,它由一個固定的棧底和一個浮動的棧頂。棧頂可以理解未是一個永遠指向棧最上面元素的指針。向棧中輸入數據的操作稱為「壓棧」,被壓入的數據保存在棧頂,並同時使棧頂指針向上浮一格。從棧中輸出數據的操作稱為「彈棧」,被彈出的總是棧頂指針指向的位於棧頂的元素。如果棧頂指針指向了棧底,則說明當前的堆棧是空的。
Stack是Java用來實現棧的工具類,它的主要方法如下:
1、構造函數
public Stack():是棧類唯一的構造函數,創建堆棧可以直接調用它。
2、壓棧與彈棧操作
public Object push(Object item):將指定對象壓入棧中。
public Object pop():將堆棧最上面的元素從棧中取出,並返回這個對象。
3、檢查棧是否為空
public Boolean empty():若堆棧中沒有對象元素,則此方法返回true,否則返回false。
見常式UseStack.java
見效果UseStack.html
⑻ 「堆棧」是什麼意思
堆棧是一種執行「後進先出」演算法的數據結構。
設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裡面,可以發現一種規律:先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以「先進後出」就是這種結構的特點。
堆棧就是這樣一種數據結構。它是在內存中開辟一個存儲區域,數據一個一個順序地存入(也就是「壓入——push」)這個區域之中。有一個地址指針總指向最後一個壓入堆棧的數據所在的數據單元,存放這個地址指針的寄存器就叫做堆棧指示器。開始放入數據的單元叫做「棧底」。數據一個一個地存入,這個過程叫做「壓棧」。在壓棧的過程中,每有一個數據壓入堆棧,就放在和前一個單元相連的後面一個單元中,堆棧指示器中的地址自動加1。讀取這些數據時,按照堆棧指示器中的地址讀取數據,堆棧指示器中的地址數自動減 1。這個過程叫做「彈出pop」。如此就實現了後進先出的原則。
堆棧是計算機中最常用的一種數據結構,比如函數的調用在計算機中是用堆棧實現的。
堆棧可以用數組存儲,也可以用以後會介紹的鏈表存儲。
下面是一個堆棧的結構體定義,包括一個棧頂指針,一個數據項數組。棧頂指針最開始指向-1,然後存入數據時,棧頂指針加1,取出數據後,棧頂指針減1。
#define MAX_SIZE 100
typedef int DATA_TYPE;
struct stack
{
DATA_TYPE data[MAX_SIZE];
int top;
};
⑼ 在單片機中什麼是堆棧它的作用是什麼
在單片機應用中,堆棧是個特殊的存儲區,主要功能是暫時存放數據和地址,通常用來保護斷點和現場。在計算機領域,堆棧是一個不容忽視的概念,堆棧是一種數據結構。堆棧都是一種數據項按序排列的數據結構,只能在一端(稱為棧頂(top))對數據項進行插入和刪除。
堆棧是一個特定的存儲區或寄存器,它的一端是固定的,另一端是浮動的。對這個存儲區存入的數據,是一種特殊的數據結構。所有的數據存入或取出,只能在浮動的一端(稱棧頂)進行,嚴格按照「先進後出」的原則存取,位於其中間的元素,必須在其棧上部(後進棧者)諸元素逐個移出後才能取出。在內存儲器(隨機存儲器)中開辟一個區域作為堆棧,叫軟體堆棧;用寄存器構成的堆棧,叫硬體堆棧。
(9)堆棧中的數據是什麼擴展閱讀:
棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的寄存器。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。另外,棧數據在多個線程或者多個棧之間是不可以共享的,但是在棧內部多個值相等的變數是可以指向一個地址的,詳見第3點。堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由於要在運行時動態分配內存,存取速度較慢。