一、從存儲數據來區分:
Java中的堆(Heap)是一個運行時數據區,用來存放類的對象;
棧(Stack)主要存放基本的數據類型(int、char、double等8種基本數據類型)和對象句柄(也可以理解為地址,不是對象本身);
二、適用範圍區分
Java中堆(Heap)是屬於進程,比如啟動一個tomcat是一個進程,這個進程有一個堆;
棧(Stack)屬於線程,每個請求都可以是一個線程,每個線程有一個屬於自己的棧空間,所有線程公用堆(Heap)空間
三、數據結構不同
Java中堆(Heap)和數據結構(屬於樹結構)的堆並不是一回事。
棧,就是數據結構的棧結構,符合棧的後進先出特點
四、訪問性能不同
棧的訪問速度更快
五、內存回收機制不同
堆(Heap)內存通過垃圾收集器回收;
棧通過,壓棧出棧,方法執行結束後,出棧完成,空間釋放;
例
以上例子中,String是一種對象,因此存放在堆中;
首先在堆中創建一個ABC字符串,然後將地址給a,然後a又將地址給了b,所以第一個輸出是true;
創建c的時候,通過new關鍵字,又在堆中創建了一個字符串ABC,然後地址給了c,所以第二個輸出是false;
這裡又引出一個知識點==比較的是兩個變量的實際值(句柄或者理解為地址),而不是堆中的ABC,
大家可以自己試試下面幾種情況,這還會引出另外一個知識點,大家多討論
閱讀更多 BeginCode 的文章