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"复制到对象中。