版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/swjtu2014112194/article/details/85112276
栈:存放基本数据类型和对象的引用变量。
堆:存放对象。
堆主要是用来存放对象的,栈主要是用来执行程序的。相较于堆,栈的存取速度更快,但栈的大小和生存期必须是确定的,因此缺乏一定的灵活性。而堆却可以在运行时动态的分配内存,生存期不用提前告诉编译器,这也导致了其存取速度的缓慢。
堆和栈的存取如下例所示:
class Rectangle{
private int width;
private int length;
public Rectangle(int width, int length){
this.width = width;
this.length = length;
}
}
public class Test{
public static void main(String[] args){
int i = 9;
Rectangle r = new Rectangle(3, 5);
}
}
在上述程序进入main()方法后,数据的存储关系如图4-11所示:
由于i为基本数据类型的局部变量,因此它存储在栈空间,而r是对象的引用变量,因此也被存储在栈空间中;实际的对象存储在堆空间中,当main()方法退出后,存储在栈中的i和r通过压栈和弹栈操作将会在栈中被回收,而存储在堆中的对象将会由垃圾回收器来自动回收。