一、内存中的堆和栈
栈内存(stack memory)在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。
堆内存(heap memory)是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。
比较:
栈 | 堆 |
内存空间由操作系统自动分配和释放 | 内存空间手动申请和释放 |
内存空间有限 | 空间是很大的自由区几乎没有空间限制 |
堆和栈的区别可以引用一位前辈的比喻来看出:
使用栈就像我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就像是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。比喻很形象,说的很通俗易懂,不知道你是否有点收获。
二、数据结构中的堆和栈
堆,通常是一个可以被看做一棵完全二叉树的数组对象。
堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵完全二叉树。
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
参考链接:
https://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html