自己谈谈对java堆和栈的理解

 

 最近看了几篇关于java堆和栈的区别的几个帖子。自己对这两个概念有了一定

了理解。
        其实java的堆和栈是一种内存资源。这里提到了内存资源,顺便说一

下其实java内存不仅仅是栈和堆。还有寄存器,常量池。
        java堆内存是一个运行时数据区域,可以动态分配内存的大小,生存

周期不必实现告诉编译器,存放对象和数组,优点是动态分配具有灵活性,缺

点是存取慢。
        java栈内存是一个数据可共享的区域,栈中数据的大小和生存周期是

确定的。栈中存放的一般是一些基本变量和对象句柄。缺乏灵活性,存取快。
        其实我感觉自己这两句话的总结应付一些面试题是没问题的。比如说

string str1=new  string(“fish”);new出的是对象,自然在堆。
string str2=“fish” 是一个变量的引用会存在栈中。所以很明显str1!

=str2。若str3=“fish”。他也是在栈中而且栈中数据共享所以str2==str3.再

说string str4= new  string(“fish”) ;虽然str4和str1都是创建对象在

堆中。但是我没说过堆中数据共享所以,所以他们只是值相同,但是str1!

=str4在字符串中equals方法我把他理解是比较数值是否相等。所以这样很好理

解这三个值都是一样的所以相等。
    说到str1!=str4,我想到一个问题就是因为他们是两个独立的对象,有各

自生命周期。所以他们生命周期是不确定的,因为运行调用而创建,不用而消

亡。所以会被GC自动回收(java的垃圾回收器)。所以堆中的数据可以通过GC

自动回收,如果不能回收,会可能出现内存溢出,一般内存溢出可能是短生命

周期的变量用长生命周期定义导致数据在内存不用,却占据内存资源,所以也

可以自己手动回收。
如果是new的对象,说明他的生命周期因为运行而生,不用而亡。说明这样可以

提高内存效率,不必总是霸占资源。所以现在我们可以知道string str=new

string(“”);比string str=“”;要好。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值