栈(stack):又名堆栈,存放的是:在函数中定义的一些基本数据类型的变量和对象的引用;当超过作用域后释放
栈(heap):存储对象,所有new出来的对象和数组
堆(二叉树):从根节点开始,每个节点都可以有左、右两个节点,元素优先将每一层按从左到右的方式填满,即父节点最多有2个子节点,有右子节点就一定有左子节点,同一层的某个节点左边一定是填满的。堆分为最大堆,最小堆,最小堆就是根节点元素值是所有元素中最小的,最大堆则相反,左右节点的大小则没有规定谁大谁小。
堆和栈的区别:
1、堆可以动态的分配内存大小(由程序员分配释放,如果程序员不释放,程序结束时可能有OS释放,分配方式类似于链表),生存周期不需要事先告诉编译器,程序运行时申请;栈通常比堆小,栈中存放的数据的大小和生存周期都必须是确定的(由编译器自动分配释放)
2、栈的存储速度比堆快,栈数据可共享
3、栈使用的是一级缓存,通常是被调用时处于存储空间中,调用完毕后立即释放;堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法决定
4、栈是运行时单位,堆是存储的单位,栈解决程序运行时的问题,即程序如何执行,或者说如何处理数据,堆解决的是数据的存储问题,即数据怎么放?放在那?
栈和队列的区别:
1、都只允许在端点处插入和删除元素
2、栈是先进后出,队列是先进先出
3、栈都是在一端进与出(仅允许在表的一端进行插入和删除操作,这一端被称为栈顶),队列则是在一端进,在另一端出(表的前端进行删除,表的后端进行插入)
java中main函数就是栈的起始点,也是程序的起始点