java中的堆和栈

 

一.堆:用new关键字建立,存放对象的内容,GC负责自动回收

你用十几个麻将牌竖直叠成一摞这叫堆,你可以从上面、下面、中间任意抽出一张牌,也可以任意插入一张。所以堆很灵活,但不安全。对于对象,我们要动态地创建、销毁,不能说后创建的对象没有销毁,先前创建的对象就不能销毁,那样的话我们的程序就寸步难行,所以Java中用堆来存储对象。而一旦堆中的对象被销毁,我们继续引用这个对象的话,就会出现著名的 NullPointerException,这就是堆的缺点——错误的引用逻辑只有在运行时才会被发现

 

1.堆是一个"运行时"数据区.类实例化的对象就是从堆上去分配空间的

2.在堆上分配内存空间是通过"new"等指令来建立的

3.Java针对堆的操作与c++的区别在于,Java程序员无需为某块内存空间不用的时候进行显示释放

4.Java的堆是由Java的内存回收机制负责处理的,动态分配内存,垃圾自动回收!

5.缺点:因为在运行时动态分配内存,所以对内存的存取速度相对较慢

 

二.栈:栈是一个比较封闭的链式结构。采用后进先出的机制存储数据。所有操作必须从一端执行。所以栈不灵活,但是很严格,是安全的,易于管理。因为只要上面的引用没有销毁,下面引用就一定还在,所以,在栈中,上面引用永远可以通过下面引用来查找对象,同时如果确认某一区间的内容会一起存在、一起销毁,也可以上下互相引用。在大部分程序中,都是先定义的变量、引用先进栈,后定义的后进栈,同时,区块内部的变量、引用在进入区块时压栈,区块结束时出栈,理解了这种机制,我们就可以很方便地理解各种编程语言的作用域的概念了,同时这也是栈的优点——错误的引用逻辑在编译时就可以被发现。

 

1.栈中主要存放基本数据类型的变量和对象句柄(引用)

2.栈的存取速度快于堆

3.栈数据可以共享

4.栈的数据大小及生存期必须是确定的,所以缺乏灵活性

 

三.怎样理解栈的"数据共享"特性

栈的数据共享特性是jvm赋予它的

当定义2个相同的变量时:int a = 5;int b = 5;

这2个变量所指向的栈上的空间地址是同一个,这就是“数据共享”

工作方式:

 jvm处理 int a = 5 时,首先在栈上创建一个变量为 a 的引用。然后去栈上查找是否有 5 这个值,若没有,则将5存放起来,将a指向5;接着处理int b = 5。先创建变量 b 的引用,结果找到5这个值,便将 b 指向 5.此时 a,b指向的是同一个内存地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值