首页 > 编程知识 正文

java 栈和堆,看堆是什么意思啊

时间:2023-05-04 11:14:20 阅读:31207 作者:3302

引言经常提到堆和堆栈。 堆和堆栈的区别和联系是什么? 数据结构中存在堆和堆栈。 java虚拟机也有堆和堆栈概念。 同样,js也有堆和堆栈的概念。 这三个为了不混淆而不同。 本文主要介绍前述三种情况中的堆和栈。

是堆内存的简称。是堆栈内存的简称。

是动态分配内存的,即使内存大小不同,也不会自动释放。自动分配相对固定大小的内存空间并由系统自动释放。

1. java堆和堆栈简要介绍java虚拟机的堆和堆栈。 JVA虚拟机在运行时在内存中打开内存空间。 JVM内存区域分为寄存器、本地方法区域、方法区域、堆栈内存和堆内存五个区域。 堆栈存储器:堆栈存储器首先是内存区域,存储的都是局部变量,方法中定义的都是局部变量,for循环内部定义的也是局部变量,加载函数后再行变量有自己的范围,离开范围后变量就会被释放。 由于局部变量的生命周期短,堆栈内存将快速更新。 堆内存:存储数组和对象。 实际上,数组是一个对象。 new创建的所有内容都位于堆中,而堆中存储的是实体(对象)。 实体用于封装数据,封装多个(实体的多个属性)。 即使一个数据消失,该实体仍可使用,从而随时释放堆,但堆栈不同。 存储在堆栈中的是一个变量。堆中的实体不会被释放,但会被视为垃圾。 Java有垃圾回收机制,不定期收集。

2 .数据结构中的堆和堆栈2.1堆的概念堆分为迷路的甜瓜堆和萝卜堆,是对迷路的甜瓜堆具有以下特性的完全二叉树:

)1)根节点有左孩子时,根节点的值小于等于左孩子节点的值。

)2)根节点有右孩子时,根节点的值小于或等于右孩子节点的值。

)3)以左右孩子为根的子树又一个个地堆积起来。

萝卜山的定义与上述相似,以下变更即可。

图1迷路的甜瓜堆

图2大根山

备注:二叉树深度为k,除第k层外其他各层(1(k-1 ) )的节点数均达到最大个数,第k层所有节点为连续集中在最左边。 这就是完全二叉树。

图3完全二叉树

2.1.1堆的抽象数据类型堆的抽象数据类型中的数据部分是用一种存储结构表示的堆,用标识符HBT表示,存储类型用标识符HeapType表示。 堆的抽象数据类型操作部分通常在堆中插入元素、从堆中删除堆的顶级元素、初始化堆、清除堆以及确定堆是否为空。

2.1.2堆栈的存储结构可以像同一组二叉树一样既采用顺序存储,也采用链存储。 但是,由于堆是完全二叉树,因此采用顺序存储是合适的,可以充分利用其存储结构。

如果要顺序存储堆,请先对堆中的所有节点进行编号,然后将编号存储在指定数组的相应元素中作为下标。 为了利用数组中的第0个元素,堆中的节点编号从0开始,而不是从1开始。 如果堆包含n个节点,编号从上到下,从同一层次的左到右,则编号范围为0到n-1。

堆中的节点从0开始编号后,编号0到n/2-1的节点为分支节点,编号n/2~n-1的节点为叶节点; 如果n为奇数,则每个分支节点都有左孩子和右孩子。 对于偶数,最大的分支节点只有左孩子,没有右孩子。 对于编号I每个分支节点,左侧子节点的编号为2i 1,右侧子节点的编号为2i 2; 除编号为0堆顶节点外,对于剩下的编号为I的节点,父母节点的编号为(i-1 )/2

2.2堆栈概念堆栈(stack )也称为堆栈,是一个具有受限运算的线性表,限制为允许在表的一端插入和删除运算。 运算堆栈的一端称为堆栈顶,堆栈顶的第一个要素称为堆栈顶要素,与之相对,另一端称为堆栈底。 在堆栈中插入元素称为“堆栈入”或“堆栈入”。 这是将元素放在堆栈顶元素上,使其成为新的堆栈顶元素。 从堆栈中删除元素(也称为堆栈或转义)删除堆栈的顶级元素,使其下的相邻元素成为新堆栈的顶级元素。

2.2.1要在堆栈顺序存储结构和操作中实现堆栈顺序存储结构,必须使用数组和整数变量来实现。 使用数组顺序记住堆栈中的所有元素,并使用整数变量记住堆栈顶层元素的下标位置。 堆栈数组用堆栈[ maxsize ]表示,表示堆栈顶级元素位置的整数变量用top表示,元素类型为ElemType的堆栈的顺序存储结构可以定义如下。 元素类型堆栈[ m

axSize]; int top。

                            图4

2.2.3  栈的链接存储结构

        栈的链接存储结构线性表的存储结构相同,是通过由节点构成的单链表实现的,此时表头指针称为栈顶指针,由栈顶指针指向的表头节点叫做栈顶结点,整个单链表被称为链栈,即链接存储的栈。

        当向一个链栈中插入一个元素时,是把该元素插入到栈顶,即使该元素的指针域指向原来的栈顶结点,而栈顶指针修改指向该元素节点,使该节点称为新的栈顶结点。

        当从一个链栈中删除元素时,是把栈顶元素结点删除掉,即取出栈顶元素后,是栈顶指针指向原栈顶结点的指针域指向的结点。

                          图5   原有栈

                               图6  插入一个结点 D

                              图7 删除结点 C 和 D

3.  JavaScript中的堆和栈 3.1  JavaScript内存机制

        JavaScript具有自动垃圾回收机制,周期性会检查没有使用的变量,进行回收释放。所以在闭包中,如果引用了外部的变量,则无法进行释放和回收,一般会传参进去。

        垃圾回收:找出那些不再继续使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔周期性地执行这一操作。

        在JS中,每一个数据都需要一个内存空间,内存空间又分为栈内存(stack)与堆内存(heap)。

3.2 栈

       栈内存一般储存基础数据类型(Undefined、Null、Boolean、Number和String)的数据。

       我们定义一个变量 var num = 1,系统自动分配存储空间。我们可以直接操作保存在栈内存空间的值,因此基础数据类型都是按值访问。

       数据在栈内存中的存储与使用方式类似于数据结构中的栈数据结构,遵循 后进先出的原则。

3.3 堆

        堆内存一般储存引用数据类型(Function,Array,Object)。

        JS的引用数据类型,比如数组Array,它们值的大小是不固定的。引用数据类型的值是保存在堆内存中的对象。JavaScript不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间。

                                                               图8  引用类型数据在内存中的存放

        因此当我们要访问堆内存中的引用数据类型时,实际上我们首先是从栈中获取了该对象的指针,然后再从堆内存中取得我们需要的数据。

        所以,基本类型赋值相互不影响,引用类型赋值,会影响原对象。

3.4 javascript存放数据特点

JavaScript具备自动垃圾回收机制

JS内存分为堆内存和栈内存

引用类型在栈中保存指针,在堆中保存对象值

栈内存数据遵循 先进后出

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。

  •  标签:  
  • java