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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xkfxm 中级黑马   /  2013-7-4 09:50  /  1248 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 xkfxm 于 2013-8-5 10:59 编辑

String s1 = "abcd";
String s2 = new String("abcd");
s1和s2的区别:s1在内存中有一个对象
                         s2在内存中有两个对象
new String()是一个对象,“abcd”是另一个对象。s2指向了new String();     new String()指向了“abcd”。所以说s2在内存中有两个对象。是这样理解吗

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 神马都是浮云

查看全部评分

3 个回复

倒序浏览
new String()开辟栈内存,栈内存里面存放的是"abcd"的地址。"abcd"存放在常量池中,字符串以拼接的形式存放,可以理解为一个对象。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
String  s= new String(   "abcd");    首先在string池内找,找到,不创建string对象;否则创建对象,这样就一个string对象   
遇到new运算符号了,在内存上创建string对象,并将其返回给s,又一个对象  

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
String类在栈中有String pool,但使用直接赋值的方式生成字符串时,1先在String pool里找是否有“abcd“”对象,如果有直接将其地址返回,如果没有就new一个,并放在pool里。
只要通过new的方式,String a=new String(“abcd”);总会在堆里生成新的对象,返回堆地址,不会用到pool里的,也是会先检查pool,pool里有“abcd”,就执行上面操作,没有现在pool里创建对象,在执行上面操作。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

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