简述堆和栈的区别


在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助。

数据结构的栈和堆

    首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。

    堆和栈都是一种数据项按序排列的数据结构。

栈就像装数据的桶或箱子

    我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。

堆像一棵倒过来的树

    而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。


(Heap)

     Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建;

     Java虚拟机规范描述:所有的对象实例及数组都要在堆上分配;

     Java堆可以处于物理上不连续的内存空间,只要逻辑上连续即可;

     (线程共享)堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问;

     (异常提示)如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError;

     (内存分配)动态分配内存

(Stack)

    存放基本类型的数据和对象的引用,即存放变量;

       如果存放的是基本类型数据(非静态变量),则直接将变量名和值存入stack中的内存中;

    如果是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中);

     (线程私有)栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存;

     (内存分配)栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生StackOverFlowError问题;

     (异常提示)如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError;

     (内存分配)内存分配固定;

     存取速度比堆要快,仅次于寄存器,栈数据可以共享;



猜你喜欢

转载自blog.csdn.net/wff900703/article/details/80426518
今日推荐