Java的堆和栈

Java中堆和栈

数据结构中的堆和栈

  1. 栈:实际上就是满足后进先出的性质,是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。
  2. 堆:堆是一种完全二叉树或者近似完全二叉树,完全二叉树是效率很高的数据结构,像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化。

系统方面的堆和栈

  1. 栈:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。
  2. 堆:堆内存存储的是数组和对象,一般new建立的都是在堆中,堆中存放的都是实体对象,实体一般是用于封装数据的,堆中的实体不会随时释放,但是会被当成垃圾,Java中有垃圾回收机制会不定时的收取。
  • 下面用一个事例详细解释一下堆和栈,比如主函数中的语句: int [] arr = new int [2];这句在内存中是怎么被定义的呢?主要流程如下:

    1. 主函数先入栈,在栈里面定义一个变量 arr。
    2. 接下来为arr 赋值,但这里的并不是一个具体值,而是一个实体。
    3. 实体是创建在堆里面的,通过new开辟一个内存空间。(内存中存储数据都是通过地址来体现的,此时为这个实体分配一个内存地址)
    4. 经过以上步骤之后,栈创建了变量,堆创建了实体,那么怎么将两个联系起来呢?
    5. 因为堆分配了一个地址给实体的,那么将这个地址赋值给变量 arr,此时arr就可以通过地址指向了数组,arr 要是想操作数组是,就可以通过该地址。
    6. int [] arr = new int [2]; 这句并不是直接将实体赋值给 arr,这种我们就不叫基本数据类型,而叫引用数据类型,此句称为 arr 引用了堆内存当中的实体。

堆和栈的区别

  • 综上所述,堆和栈的区别很明显:
    1. 栈内存存储的是局部变量而堆内存存储的是实体。
    2. 栈内存的更新速度要快于堆,因为局部变量离开了作用域就会释放。
    3. 栈内存存放的变量一旦离开了作用域(方法)就会被释放,而堆内存的实体只会被垃圾回收机制不定时的回收。

JVM 的内存划分

  1. 寄存器
  2. 本地方法区
  3. 方法区
  4. 栈内存
  5. 堆内存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值