现在的位置: 首页 > 综合 > 正文

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

2013年08月18日 ⁄ 综合 ⁄ 共 860字 ⁄ 字号 评论关闭

 

 最近看了几篇关于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=“”;要好。

抱歉!评论已关闭.