Version: Next
栈(Stack)
栈和队列
程序=算法+数据结构
但是对于大部分码农来说,程序=框架+业务逻辑
- 栈
- 后进先出 、 先进后出
- 队列
- 先进先出(FIFO:First In First Out)
Stack栈是什么
栈管理程序运行
存储一些八大基本类型的值、对象的引用、方法等
栈的优势:存取速度比堆快,仅次于寄存器,栈数据可以共享
思考:为什么main()方法最后执行,为什么一个test()方法执行,才会继续执行main方法
口诀
喝多了吐就是栈,吃多了拉就是队列
- 栈也叫栈内存,主管Java程序的运行,实在线程创建时创建的,它的生命周期跟随线程的生命周期,线程结束栈内存也就释放
- 对于栈来说不存在垃圾回收问题,只要线程一结束,该栈就终结,生命周期与线程一致,栈是线程私有的
- 方法自己调用自己就会导致栈溢出(循环压栈)
public class StackDemo {
public static void main(String[] args) {
a();
}
public static void a(){
b();
}
public static void b(){
a();
}
}
栈帧
栈运行原理
- Java栈的组成元素——
栈帧
方法A调用方法B
每一个调用的方法都会产生一个栈帧,程序正在执行的方法在栈的最顶部,执行完就弹出栈,直到栈弹空
栈满了就会StackOverFlow,这是一个Error不是Exception,更严重一些
栈、堆、方法区的交互关系
User user = new User()
,在栈中放了一个名为user
的引用,在堆中利用加载的Class实例化一个User类的实例化对象,将其地址存在user
引用内存空间中。- 实例化对象中的常量再去方法区的运行时常量池中拿