无论是堆, 还是栈,都是一种数据结构, 不过因为各自的特性不同, 所以有不同的应用.
堆内存:
首先,堆是一个运行时数据区,是一种完全二叉树结构 , 通过new等指令创建的对象, 句柄存在于栈中,实体都存在于堆中. 所谓的完全二叉树:即是除了最后一层节点以及其父节点外, 其他的节点都是满树的状态, 且对最后一层的节点 也有要求, 即使没有全满, 该层的所有节点也都全部靠左. 而完全二叉树结构 是一种效率相对很高的一种数据结构, 所以堆结构 在数据处理方面具有很大的优势.
总结: 在内存中,对堆区间, 可动态分配内存大小,生存周期也不必事先告诉编译器,Java垃圾回收自动回收不需要的数据;在数据处理方便 是效率很高的一种数据结构.
栈内存:
栈(stack)又名堆栈,它是一种先进后出(FILO)的线性表结构, 可以把这种结构想象成一个口朝上的桶结构, 桶口被称为栈顶 , 桶底, 被称为栈底 , 而当向桶内装东西(数据)的时候, 先装的数据反而在底层, 当从桶内拿东西的时候, 只能先拿离桶口最近的, 这就形成了栈的FILO 的特殊结构, 存数据的动作,被称作 压栈(底) , 取数据动作, 被称作 弹栈 .
栈结构 往往和队列结构相比较, 因为他们是两个完全相反的,数据存取顺序, 队列秉行的是先进先出(FIFO)的模式, 顾名思义,可以把它想象成一个隧道, 第一个进入入口, 也会第一个走出出口. linkList的集合,被称为万能集合, 既可以模拟出 栈结构, 也可以模拟出队列结构 , 具体的模拟方案, 网上很多, 我就不再赘述了, 喜欢底层结构的可以搜集 研究下, 对理解这两种数据结构会有很大的帮助.
总结: 在内存中 , 栈结构主要用来储存 句柄和成员方法, 具有数据共享的特性. 在数据存储方面, 栈的存取速度极快 , 效率在 堆结构和寄存器之间, 但是 栈结构也有自己限制, 存储的数据在存储的同时,数据的大小,和生存周期必须确定 , 这就对其内部存储的数据的应用 产生了极大的限制 , 缺乏灵活性.
堆栈数据结构, 各有千秋, 大家也可以根据实际的开发场景, 优化选择.