Java堆栈
介绍
栈是一种后进先出的线性表数据结构,分为栈顶和栈底两端,仅允许在表的一端插入元素,这一端被称为栈顶,另外一端称之为栈底。栈,只有两种操作,分为入栈(压栈)和出栈(退栈);向栈中添加元素的操作叫做入栈,相反从栈中删除元素叫做出栈。
特点
• 只能从栈顶添加元素或者删除元素
• 后进先出的数据结构,Last In First java 堆栈基础 Out(LIFO)
为了大家更好的形象了解我们通过示意图来看一下栈的入栈和出栈操作
1. 入栈操作示意图
2. 出栈操作示意图(后进的元素先出)
栈的基本操作
• 向栈中添加一个元素(入栈)
• 从栈中删除一个元素(出栈)
• 查看栈顶元素
• 查看栈中元素个数
• 判断栈是否为空
实现栈的方式,实际上底层有多种实现方式,比如:动态数组等,这里我们使用Java语言本身为我们提供的集合LinkedList
1. 接口定义:Stack<E>
2. LinkedListStack<E> 类实现接口Stack<E>
3. 测试类:LinkedListStackTest
4. 运行结果
栈的应用
虚拟机栈的入栈和出栈操作
在Java虚拟机运行时数据区有一块被称之为:虚拟机栈,它是线程私有的,声明周期与线程相同。
我们编写的每个Java方法,每个方法都会在执行的时候同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应这一个栈帧在虚拟机栈中入栈到出栈的过程。
现在我们假设有A、B、C三个方法,在A方法中调用B方法(A->B),在B方法中调用C方法(B->C),C方法执行本方法业务逻辑。
当程序执行到A()方法的中的第二行时,此时程序会中断A()方法并开始调用B()方法,然后会在虚拟机栈中记录调用B()方法的栈帧,我这里暂且称之为A2(实际存储的并不是O(∩_∩)O哈!)示意图如下:
同理,当程序执行到B()方法中第二行时,此时程序也会中断B()方法开始调用C()方法,然后同样地会在虚拟机栈中生成调用C()方法的栈帧并记录,我这里暂且称之为B2,示意图如下:
当程序开始执行到C()方法时,直到执行完C()方法时,这时候,程序该如何执行呢?
此时就要查看一下虚拟机栈了,发现虚拟机栈,栈中栈顶的元素是B2,我们的程序就知道了,它是执行到B()方法的B2位置就中断了,去执行C()方法了;现在C()方法执行完成之后,它就可以跳回到B2的位置继续执行了,当B()方法执行完之后,虚拟机栈中的B2栈帧也就可以出栈了,依次类推....
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/1616.html