Java 中有兩種數據結構,堆和棧。堆是一種動態分配的內存池,用于存儲對象。棧是一種先進后出的數據結構,用于存儲函數調用時的變量和參數。
// 棧 public void foo() { int a = 1; int[] b = {2, 3, 4}; String c = "hello"; bar(a, b, c); } public void bar(int x, int[] y, String z) { // ... } // 堆 public class Student { private String name; private int age; // ... } public void baz() { Student s = new Student(); s.setName("Alice"); s.setAge(20); }
棧中的變量和參數在函數結束后會自動釋放。堆中的對象則需要通過垃圾回收機制來進行釋放。在 Java 中,所有的對象都在堆中創建。
一些常見的 Java 對象,比如字符串和數組,都是存儲在堆中的。通常,對象只有在被顯式地設置為null
或失去了所有引用后,才可以由垃圾回收機制進行回收。
因為堆是動態分配的內存池,所以其容量也是動態變化的。棧則具有固定 的容量。當棧空間不足時,程序會拋出棧溢出異常,而當堆空間不足時,程序會拋出內存溢出異常。