什么是堆、栈

堆和栈都是数据项按序排列的一种数据结构,堆的操作随意,栈只能在栈顶进行操作(插入和删除,遵从后进先出规则)。

下面是栈数据结构示意图

java中的堆和栈的数据结构_JVM

堆简介

堆通常是可以看做一棵树的数组对象,堆具有:

  1. 堆是在Java程序运行时向程序申请某个大小的存储空间,即动态分配内存空间,对堆的访问和普通内存访问相同;
  2. 堆一般存放引用类型的对象,也就是我们通过new创建的对象存储在堆中,数组值也可以存储在堆中;
  3. 对于类的非静态成员变量值(不管是基本数据类型还是引用类型)、非静态成员变量的引用,存储在堆中:(例如在可以在类中创建一个int类型的数组变量:
    int[] array = new int[]{1,2};虽然是1,2这两个是基本类型的数据,但是因为new int[]{1,2}了一个对象,这个对象是存储在堆中,所以1,2也存储在堆中。)

栈简介

1.栈是一种运算受限的线性表结构,因为他只允许在一头也就是栈顶进行插入或删除操作;
2. 栈就相当于一个桶后放进去的先拿出来,它下面本来有的东西要等上边的出来之后才能出来,在栈中遵循先进后出原则
3.栈为即时调用的方法开辟空间,存储局部变量值(基本数据类型),局部变量的引用,对象属性的引用。当一段代码或者一个方法调用完毕后,栈中为这段代码所提供的基本数据类型或者对象的引用立即被释放;注意:局部变量必须手动初始化。

什么是队列

  1. 1.队列也是一种特殊的线性表结构,与栈的区别是,队列分为队头和队尾,插入操作在队尾进行,删除操作在队头进行;
  2. 建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它主要指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。
  3. 在队列中新元素(等待进入队列的元素)总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。每次读取一个元素,释放一个元素。可以称之为动态创建,动态释放。这也使得基本不会造成内存溢出等问题。

总结

  1. 堆是在程序运行时动态申请一个内存空间,而不是在编译时申请;
  2. 栈相当于一个桶,后进入的先取出来,遵从后进先出原则
  3. 队列,只能在队头进行读取删除,在队尾进行插入新的数据,取一个存一个,先进入的先出