Version: Next

栈(Stack)

栈和队列

程序=算法+数据结构

但是对于大部分码农来说,程序=框架+业务逻辑

    • 后进先出 、 先进后出
  • 队列
    • 先进先出(FIFO:First In First Out)

Stack栈是什么

栈管理程序运行

存储一些八大基本类型的值对象的引用方法

栈的优势:存取速度比堆快,仅次于寄存器,栈数据可以共享

思考:为什么main()方法最后执行,为什么一个test()方法执行,才会继续执行main方法

口诀

喝多了吐就是栈,吃多了拉就是队列

  1. 栈也叫栈内存,主管Java程序的运行,实在线程创建时创建的,它的生命周期跟随线程的生命周期,线程结束栈内存也就释放
  2. 对于栈来说不存在垃圾回收问题,只要线程一结束,该栈就终结,生命周期与线程一致,栈是线程私有的
  3. 方法自己调用自己就会导致栈溢出(循环压栈)
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引用内存空间中。
  • 实例化对象中的常量再去方法区的运行时常量池中拿