A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐强 中级黑马   /  2012-10-31 11:54  /  1168 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐强 于 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的关系?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

1 个回复

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

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马