面試題-heap 和 stack 的區別

一、從存儲數據來區分:

Java中的堆(Heap)是一個運行時數據區,用來存放類的對象;

棧(Stack)主要存放基本的數據類型(int、char、double等8種基本數據類型)和對象句柄(也可以理解為地址,不是對象本身);

二、適用範圍區分

Java中堆(Heap)是屬於進程,比如啟動一個tomcat是一個進程,這個進程有一個堆;

棧(Stack)屬於線程,每個請求都可以是一個線程,每個線程有一個屬於自己的棧空間,所有線程公用堆(Heap)空間

三、數據結構不同

Java中堆(Heap)和數據結構(屬於樹結構)的堆並不是一回事。

棧,就是數據結構的棧結構,符合棧的後進先出特點

四、訪問性能不同

棧的訪問速度更快

五、內存回收機制不同

堆(Heap)內存通過垃圾收集器回收;

棧通過,壓棧出棧,方法執行結束後,出棧完成,空間釋放;

面試題-heap 和 stack 的區別

例子1:

以上例子中,String是一種對象,因此存放在堆中;

首先在堆中創建一個ABC字符串,然後將地址給a,然後a又將地址給了b,所以第一個輸出是true;

創建c的時候,通過new關鍵字,又在堆中創建了一個字符串ABC,然後地址給了c,所以第二個輸出是false;

這裡又引出一個知識點==比較的是兩個變量的實際值(句柄或者理解為地址),而不是堆中的ABC,

大家可以自己試試下面幾種情況,這還會引出另外一個知識點,大家多討論

面試題-heap 和 stack 的區別

自己聯繫及思考,


分享到:


相關文章: