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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾辉 黑马帝   /  2012-2-11 15:00  /  1451 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s = new String("XYZ") + new String("XYZ");到底创建几个对象?

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 彭坤 于 2012-2-11 17:15 编辑

3个,两次new String("XYZ")产生两个对象,给s赋值以后,相当创建了一个对象,1+2=3

做了个测试,把代码和结果贴上来供大家观摩
public class Test {
        public static void main(String[] args) {
               String s = "";
               System.out.println("s:"+s.hashCode());
               String s1 = new String("XYZ");
               String s2 = new String("XYZ");
               s=s1+s2;
               System.out.println("s1:"+s1.hashCode());
               System.out.println("s2:"+s2.hashCode());
               System.out.println("s:"+s.hashCode());

        }
}
-----------------------运行结果--------------------------
s:0
s1:87417
s2:87417
s:-1690640032

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
三个吧 两次new两个 必须的
一个+连接两个串算一个
对象放堆里面 s是对象引用 放代码区了
回复 使用道具 举报
三个 s的内容是XYZXYZ,有两个内容"XYZ"

使用new关键字 不管内存中是否存在该对象,都会在堆内存中划分一块区域储存

所以一个是存在于字符串池中的"xyz",两个是存在于堆内存中由栈内存中的s引用。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
我认为是4个对象
毕老师视频里说过 String s=new String("abc");这里是创建了2个对象 一个为常量池中的"abc"一个为堆内存中的String对象
而 在String s = new String("XYZ") + new String("XYZ");中
第一个new String("XYZ")创建了2个对象 一个是常量池中的"XYZ" 一个为堆内存中的String对象
第二个new String("XYZ")又创建了1个对象 是堆内存中的一个新的String对象( 因为常量池中已有"XYZ"不需要再建立)
然后加起来对String s进行赋值 又是1个对象 s指向常量池中的"XYZXYZ"

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
3或者4个,如果以前出现过"XYZ" 那么就三个对象,如果以前没有出现过 就是4个,原因大家都说了。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

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