1. 棧(stack)
在Java中,棧(stack)是由編譯器自動分配和釋放的一塊內存區域,主要用於存放一些基本類型(如int、float等)的變量、指令代碼、常量及對象句柄(也就是對象的引用地址)。
棧內存實際上就是滿足先進后出的性質的數學或數據結構,棧內存的操作方式類似於數據結構中的棧(僅在表尾進行插入或刪除操作的線性表)。
棧的優勢在於,它的存取速度比較快,僅次於寄存器,棧中的數據還可以共享,當超過變量的作用域后,Java會自動釋放掉為該變量所分配的內存空間。
缺點表現在,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。
2.堆(heap)
堆(heap)是一個程序運行動態分配的內存區域,堆內存實際上指的就是優先隊列的一種數據結構.
在Java中,構建對象時所需要的內存從堆中分配。這些對象通過new指令“顯式”建立,這種分配方式類似於數據結構中的鏈表。
堆內存在使用完畢后,是由垃圾回收(Garbage Collection,GC)器“隱式”回收的。
堆的優勢是在於動態地分配內存大小,可以“按需分配”,其生存期也不必事先告訴編譯器,在使用完畢后,Java的垃圾收集器會自動收走這些不再使用的內存塊。
缺點為,由於要在運動時才動態分配內存,相比於棧內存,它的存取速度較慢。
總結:
1.Java開發時候盡量使用基礎類型,少使用包裝類型
2.定義集合的時候盡量指定大小,減少擴容開銷
參考:https://www.cnblogs.com/Hellorxh/p/10832256.html ,https://zhidao.baidu.com/question/1175180858536253379.html