Java面試當中常常會問到堆和棧的問題。堆和棧都是Java中的重要概念。
棧是一種線性結構,與之相反的是堆是一種非線性結構。在Java中,棧和堆是內存的兩個重要組成部分,它們各自有一定的作用和特點。
棧的特點: 1. 棧是一種具有“先進后出”(LIFO)的結構; 2. 棧是一塊連續的內存空間,對于棧的大小與位置是有限制的; 3. 棧中存儲的數據大小固定,不能動態擴展或減少; 4. 棧中的數據類型都必須是確定的,儲存時間也必須是確定的; 5. 棧內存儲的變量的生命周期由自己的作用域決定,當離開這個作用域時,棧中儲存的數據會自動銷毀。 堆的特點: 1. 堆是一種非線性結構,是可以動態擴展和縮小的; 2. 堆內存的大小一般是不受限制的,可以利用動態內存分配來實現; 3. 堆內存儲的數據類型也可以是動態的,可以動態分配和釋放; 4. 堆中的對象生命周期是不確定的,由GC(垃圾回收器)決定何時回收,開發人員無法直接操作。
在Java中,堆和棧都有各自的用處。棧的主要作用是用來保存基本數據類型的變量和對象的引用;而堆則主要用來保存Java對象。當聲明一個對象時,對象的引用存儲在棧中,但對象本身存儲在堆中。