本帖最后由 李连闯 于 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; |