简述java堆和栈

76 阅读2分钟

Java 中的「栈」和「堆」是两个很常见的概念。下面简单介绍一下它们:

  • 栈(Stack)存储:基本类型变量和对象引用变量

栈是一种数据结构,它采用的是「先进后出」的原则。在 Java 中,栈主要用来存储基本类型变量和对象引用变量。基本类型变量的值是直接存储在栈内存中的,对象引用变量存储的是一个指向堆内存地址的引用。

简单来说,栈用来存储局部变量和方法调用。当一个方法被调用时,Java 虚拟机会在栈中创建一个新的栈帧,它包含了这个方法的参数、变量等信息,并把这个栈帧推入栈顶。当方法执行完毕时,这个栈帧会被从栈中弹出。

  • 堆(Heap)存储:对象和数组

堆是另外一种数据结构,它采用的是「先进先出」的原则。在 Java 中,所有的对象和数组都存储在堆内存中。当我们使用 new 关键字创建一个对象时,系统会在堆中为这个对象分配一块内存空间,并返回一个指向这个对象的引用。

堆内存的主要作用就是存储动态分配的数据,它的空间大小一般比较大,一般要通过垃圾回收机制回收。

总的来说,栈和堆在 Java 中都是非常重要的概念。栈的操作速度快,但是空间有限,主要用来处理局部变量和方法调用;而堆空间相对较大,用来存储对象和数组等动态分配的数据。

  • java 栈和堆的区别:

从定义来看,我们会发现两者还是很难直接理解他们的意思和区别,但是其实只要了解了他们的特性和区别,自然也就能理解他们的含义了。

我们可以把栈想象成一个装书的书架,每本书都有一个编号,最新放进来的书被放在最上面。我们可以很方便地把一本编号为 6 的书取出来,但想要取出一本编号为 1 的书,需要先把你面前编号为 2、3、4、5 的书全部取出来,才能拿最里面的 1 号书。

而堆就像是一个玩具箱,里面的玩具没有编号,我们只能用手去摸、找。如果想找到特定的玩具,需要仔细地搜索整个玩具箱,有时还要移动一些玩具。

所以,栈和堆的区别就是栈比较直观方便,但只能取出最新的数据;而堆不方便查找,但能随意存取一些数据。这就好像在书架上找书和在玩具箱里找玩具的区别一样。