今天在面试时遇到了这个问题,关于java中栈和堆的区别、哪个操作效率更高,把我难为住了....
Java把内存划分成两种:一种是栈内存,一种是堆内存。堆是用来存放对象的,栈是用来运行程序的。 一、栈
1、在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。例如:
String str = new String("test");
这条语句,它的执行过程是先在堆上new 了一个值为"test"的String对象,然后栈上又新建一个str来指向上面新建的"test"对象,即str是"test"的引用。所以Java中对象的新建都是在堆上进行的,对象的引用一般都是在栈上。一般每个方法的调用都会独立有一个栈来保存str这样的对象的引用变量,在方法返回后,栈会清空,所以引用变量会被清空掉,这是堆上的对象,如果没有其他的引用变量引用它,就会被Gc在某个合适的时候gc掉
2、当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 二、堆
堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
三,在执行效率上
堆的优势是可以自动分配内存的大小,生存期也不用实告诉编辑器,java的垃圾回收器会自动的回收这些不用的数据。缺点是由于要动态的分配内存,存储效率会比较的慢。
栈的优势是存取效率比较快,仅次于寄存器,栈数据可以共享。但缺点是栈中的数据大小和生存期的固定的,缺乏灵活性。
栈中主要存储些基本的数据像int、short、byte等。栈的存储比较快,但是删除就不是那么好了。