首先我们需要知道的是栈和堆是两种数据结构
1.栈和堆的定义
栈:是一种先进后出的数据结构,是一种线性结构
堆是一种树形结构,是一颗完全二叉树, 其存储的元素可以通过指针或引用访问
- 最大堆【大根堆】 :堆中的每一个节点的值都大于等于子树中所有节点的值
- 最小堆【小跟堆】:堆中的每一个节点的值都小于等于子树中所有节点的值
2.栈和堆的内存分配
栈是一种静态内存分配,堆是一个优先对列,按优先级进行排序。系统在编译阶段就确定了分配给栈的内存空间,栈内存的释放是由系统自动完成的
堆采用的是动态内存分配,程序在运行时向操作系统请求分配一段空间,然后在手动释放
栈:【静态内存分配,编译阶段就确定了分配给栈的内存空间,栈内存的释放由系统完成】
堆:【动态内存分配,在程序运行时请求分配空间,手动释放】
存储内容:栈中存储的是函数的调用和局部变量,堆中存储的是对象的实例
栈:原始数据类型(Undefined、Null、Boolean、Number、String)
堆:引用数据类型【对象数据类型 / 复杂数据类型 】(对象、数组和函数)
3.栈和堆的优缺点
栈的内存分配效率高:栈是一种线性结构,内存使用效率高
堆:可以动态分配内存,使用比较灵活,堆中存储的数据可以被持久化,不会随着函数调用结束而被销毁
缺点:
栈:空间有限,存储空间比堆小,存储变量过多或递归调用就可能出现栈溢出的问题,比较容易导致系统崩溃
堆:内存的分配和释放需要手动执行,如果分配的内存空间过多或者没有及时释放就会导致内存溢出的问题,如果开发者不释放,在程序结束之后可能由垃圾回收机制回收。
补充:
其中堆不一定是完全二叉树,只是为了方便存储和索引,我们通常用完全二叉树的形式来表示堆而已。
二叉堆:是一个数组,它可以被看成是一个 近似的完全二叉树
什么是完全二叉树,它的叶子节点都在最后一层,并且这些叶子节点都是靠左排序的。