Java中的棧和堆是兩種不同的數據結構,用來存儲程序中的變量和對象。
棧(Stack)是一種先進后出(Last In First Out)的數據結構,用于保存基本數據類型和對象的引用。在Java中,每個方法都有一個棧幀(Stack Frame)用于存儲局部變量和方法返回值。
堆(Heap)是一種動態分配的內存區域,用于存儲對象。在Java中,所有的對象都存儲在堆中,并由垃圾回收器負責回收不再使用的對象。
棧和堆在內存中的分配方式不同。棧是一個連續的內存空間,每個棧幀的大小可以在編譯時確定,所以棧的空間是靜態的。堆的大小不是在編譯時確定的,而是在運行時動態分配的。
棧的存儲方式比堆更快,在方法調用時,棧的數據可以直接進行壓棧和出棧操作,不需要遍歷整個堆來搜索對象。棧的缺點是空間有限,每個棧幀的大小也是有限制的。
public class StackExample { public static void main(String[] args) { int a = 10; int b = 20; int c = a + b; System.out.println(c); } }
上面的代碼中,a、b和c三個變量都是存儲在棧中的。當程序執行到int a = 10;時,會在棧中分配一個int類型的內存空間,將10存儲在這個空間中,并將變量a指向這個空間。
public class HeapExample { public static void main(String[] args) { String str = new String("Hello World"); System.out.println(str); } }
上面的代碼中,字符串對象是由new關鍵字動態分配的,存儲在堆中。當程序執行到new String("Hello World");時,會在堆中分配一個String類型的對象,并將字符串"Hello World"復制到對象中。