Java中的堆(heap)和栈(stack)

栈(stack)

  • 概念:用于存储局部变量,数据使用完毕之后,将自动释放。

  • 优势:

    • 在栈中的存取速度是比堆(heap)快的。
    • 栈中的数据是可以共享的。

举例:

​ int A = 7;

​ int B = 7;

1、首先"7"这个值,因为大小可知,生命期可知(在程序中定义使用,程序结束后就会消失。)

2、所以程序会在栈中去创建变量A,变量A中去存放7的值的地址。

3、现在又要去创建一个变量B,由于在栈中已经拥有了"7"这个值的地址,所以变量B将直接引用"7"的地址。

4、此时,变量A和变量B存放的地址,都是值为"7"的地址。这也就能体现,在栈中的数据是共享。


这个时候就有一个新的问题将抛出,如果这个时候让A=5。变量A和变量B的会一样吗?

1、首先编译器识别到A=5,会在栈中去搜寻是否存在值为"5"的地址。若存在,那么直接引用,若不存在,则会重新开辟新的地址去存放"5"的值。

2、所有无论在栈中变量A怎么变,变量B都不会发生改变,因为变量B的值始终都是"7",不会因为变量A的值改变而改变。

  • 缺点:
    • 在栈中的数据的大小和生命期必须是确定的,不够灵活。

堆(heap)

  • 概念:通过new一个对象,或者创建一个数组的时候,就会在堆中开辟一部分空间用于存放。创建出来的对象都拥有默认值。当不在被使用的时候就会被自动回收处理。

  • 优势:

    • 在堆中,可以动态的去分配内存的大小,生命期也不需要提前准备好。
    • 在Java的垃圾回收机制中,会自动回收不再使用的数据。
  • 缺点:

    • 因为堆是动态分配内存的,所以存取速度会较慢。

堆和栈的区别

  • 相同点:
    • 都是Java内存的一种。
    • 使用完毕之后,Java垃圾回收机制都会自动的去回收它们。
  • 不同点:
    • 栈内存:
      • 栈内存中一般都会存放8种基本数据类型的变量、对象的引用和方法。
      • 栈中遵循,先进后出的规则。
      • 占内存中不能被其他线程所访问。
      • 栈内存生命周期短。
    • 堆内存:
      • 存放new出来的对象和数组。
      • 堆中遵循,先进先出,后进后出的规则。
      • 存储在堆中的对象,是能够被全局是访问的。
      • 堆内存生命周期是从,程序开始运行到运行结束。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值