黑马程序员技术交流社区
标题:
java内存机制
[打印本页]
作者:
徐强
时间:
2012-10-31 11:54
标题:
java内存机制
本帖最后由 徐强 于 2012-10-31 15:19 编辑
java中的数据是怎么存储的呢,堆和栽的区别,对象,常量,局部变量,全局变量,string类型的常量和变量是怎么储存的。string str1 = "abc";与 string str2 ="ab"+"c";有区别没?string str3 = "ab";String str4 = "c";String str5 = str3+str4;中str5与str1的关系?
作者:
李连闯
时间:
2012-10-31 13:57
本帖最后由 李连闯 于 2012-10-31 14:19 编辑
简单来看 堆是用来存占用空间大的对象实体的,而栈是用来存放基本数据和对象引用的;
对象--->>>堆区中
对象引用--->>>栈区中
常量--->>>方法区中的常量池中,(方法区也称静态区也是堆区的一部分)
全局变量或者局部变量也需要分成对象,基本类型数据,常量再来看具体的分配;
对于String类型的数据:(问题中的例子均属于第2类)
1) 以String str = new String("aaa")的方式,当然每一次都会创建新对象;
2) 以String str = "aaa"双引号的方式赋值,首先虚拟机会去常量池寻找有没有"aaa"值的,有的话直接把str指向他,没有的话会创建"aaa";
还需要了解一句话:常量池(constant pool)指的是在
编译期
被确定,并被保存在已编译的.class文件中的一些数据。关键在于这个编译期,
String str1 = "abc";与String str2 ="ab"+"c";在编译期就可以确定均是指向常量池中的"abc"的,所以str1==str2比较为true;
String str3 = "ab";
String str4 = "c";
String str5 = str3+str4;对于str5来说编译期间只能是知道str5是由
变量
str3+str4得到的,不能直接得出str5的值,所以和常量池就扯不上关系了,会在堆区中创建新的对象,str5和str1不是同一个对象,所以str5==str1比较为false;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2