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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 236gswqt 中级黑马   /  2014-6-25 15:22  /  1543 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

     创建string对象时,使用String s = new String(“abc”)和 String s = “abc”语句上具体区别是什么?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

5 个回复

倒序浏览
就是在 开辟对内存的时候有区别,使用new String("abc"); 系统会强制行的在堆内存中开辟一块内存,而String s  = "abc",系统先会检测,如果堆内存中已经有“abc”这块内存了,这时系统不会开辟新内存,直接将s的引用指到原有内存“abc”上

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
001可望成功 发表于 2014-6-25 15:37
就是在 开辟对内存的时候有区别,使用new String("abc"); 系统会强制行的在堆内存中开辟一块内存,而String ...

谢了  懂了
回复 使用道具 举报
JAVA为了提高效率,对String类型进行了特别的处理:为string类型提供了串池 ,如果是String s = new String(“abc”),不管串池里有没有"abc",它都会在堆中重新分配一块内存,定义一个新的对象;而如果是String s = “abc”,则会判断串池中是否有“abc”,如果有则s直接指向“abc”,如果没有,在串池中开辟一块空件,存放“abc”
1. String str1 = "abc";
    System.out.println(str1 == "abc");
1) 栈中开辟一块空间存放引用str1;
2) String池中开辟一块空间,存放String常量"abc";
3) 引用str1指向池中String常量"abc";
4) str1所指代的地址即常量"abc"所在地址,输出为true;

2. String str2 = new String("abc");
    System.out.println(str2 == "abc");
1) 栈中开辟一块空间存放引用str2;
2) 堆中开辟一块空间存放一个新建的String对象"abc";
3) 引用str2指向堆中的新建的String对象"abc";
4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false;

3. String str3 = new String("abc");
    System.out.println(str3 == str2);
1) 栈中开辟一块空间存放引用str3;
2) 堆中开辟一块新空间存放另外一个(不同于str2所指)新建的String对象;
3) 引用str3指向另外新建的那个String对象 ;
4) str3和str2指向堆中不同的String对象,地址也不相同,输出为false;



回复 使用道具 举报
我也明白了
回复 使用道具 举报
本帖最后由 alive 于 2014-6-25 18:48 编辑

首先,字符串对象是在方法区的常量池中,不是在堆内存中。String s = new String(“abc”)会到常量池找有没有“abc”对象,没有的话就会在常量池中创建“abc”对象,然后堆内存的new String()指向“abc”,也就是把“abc”的地址赋值给new String(),堆中的new String()再把自己的地址赋值给栈内存中的变量s
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马