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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  String s1 = “abc”;
   String s2 = new String(“abc”);
   System.out.println(s1==s2);
   String s3 = “你好吗”;
   String s4 =”你”;
   String s5 =”好吗”;
   System.out.println(s3==(s4+s5))

我的思路:s3 先在常量池给“你好吗”字符串开辟空间 0x0001,s4 判断常量池有没有“你”字符串,结果没有,在常量池开辟新空间给“你”,0x0002,s5和s4一样的道理,又在常量池开辟了新空间0x0003,s4和s5拼接成“你好吗”,结果常量池有“你好吗”字符串,
然后指向了 0x0001,s3==(s4+s5) 比较地址值,结果为true
哪里有什么不对的吗?求大神指点,转不过来弯了已经

6 个回复

倒序浏览
没人吗?
回复 使用道具 举报
hyl 中级黑马 2015-12-13 22:09:52
藤椅
一看就知道,上课没认真听
回复 使用道具 举报
hyl 发表于 2015-12-13 22:09
一看就知道,上课没认真听

解释一下呗
回复 使用道具 举报
为了节省内存空间,java常量池中不会存在两个一模一样的对象,S4与S5一拼接后发现在常量池中有与之一模一样的S3,这时,系统会自动把S3的地址赋给S4+S5.因此S3==S4+S5的结果为true

评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1

查看全部评分

回复 使用道具 举报
songjianzaina 发表于 2015-12-13 22:58
为了节省内存空间,java常量池中不会存在两个一模一样的对象,S4与S5一拼接后发现在常量池中有与之一模一样 ...

答案应该是false,我上边说的是我昨天的思路,但是是错误的,我把老师讲的没理解清除,今天我问了一下老师,然后就是String s4 ="你",String s5 ="好吗" 然后 s4+s5 相当于是两个对象,会在堆内存产生一个StringBuffer 对象,而在常量池中找的话是  String s = “你”+“好吗”;这种,这个是常量的拼接会在常量池中找,而前边的话会在堆内存中产生, 用 == 比较地址值,返回的结果是false
回复 使用道具 举报
马赛 发表于 2015-12-14 21:23
答案应该是false,我上边说的是我昨天的思路,但是是错误的,我把老师讲的没理解清除,今天我问了一下老 ...

   情况一:
                  String s1 = "abc";
                   String s2 = new String("abc");
                   System.out.println(s1==s2);//false
                   String s3 = "你好吗";
                   String s4 ="你";
                   String s5 ="好吗";
                   String s6="你"+"好吗";
                   System.out.println(s3==s6);//true
=================================================
情况二:
                   String s1 = "abc";
                   String s2 = new String("abc");
                   System.out.println(s1==s2);//false
                   String s3 = "你好吗";
                   String s4 ="你";
                   String s5 ="好吗";
                   String s6=s4+"好吗";
                   System.out.println(s3==s6);//false
=================================================
情况三:
                   String s1 = "abc";
                   String s2 = new String("abc");
                   System.out.println(s1==s2);//false
                   String s3 = "你好吗";
                   String s4 ="你";
                   String s5 ="好吗";
                   System.out.println(s3==(s4+s5));//false
===============================================
单纯的字符串与字符串拼接结果为true,两个字符串对象的拼接结果为false,多谢提醒~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马