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