黑马程序员技术交流社区

标题: 今天的考试题,关于字符串拼接比较地址值的问题,没弄懂 [打印本页]

作者: 马赛    时间: 2015-12-13 21:16
标题: 今天的考试题,关于字符串拼接比较地址值的问题,没弄懂
  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
哪里有什么不对的吗?求大神指点,转不过来弯了已经
作者: 马赛    时间: 2015-12-13 22:06
没人吗?
作者: hyl    时间: 2015-12-13 22:09
一看就知道,上课没认真听
作者: 马赛    时间: 2015-12-13 22:46
hyl 发表于 2015-12-13 22:09
一看就知道,上课没认真听

解释一下呗
作者: songjianzaina    时间: 2015-12-13 22:58
为了节省内存空间,java常量池中不会存在两个一模一样的对象,S4与S5一拼接后发现在常量池中有与之一模一样的S3,这时,系统会自动把S3的地址赋给S4+S5.因此S3==S4+S5的结果为true
作者: 马赛    时间: 2015-12-14 21:23
songjianzaina 发表于 2015-12-13 22:58
为了节省内存空间,java常量池中不会存在两个一模一样的对象,S4与S5一拼接后发现在常量池中有与之一模一样 ...

答案应该是false,我上边说的是我昨天的思路,但是是错误的,我把老师讲的没理解清除,今天我问了一下老师,然后就是String s4 ="你",String s5 ="好吗" 然后 s4+s5 相当于是两个对象,会在堆内存产生一个StringBuffer 对象,而在常量池中找的话是  String s = “你”+“好吗”;这种,这个是常量的拼接会在常量池中找,而前边的话会在堆内存中产生, 用 == 比较地址值,返回的结果是false
作者: songjianzaina    时间: 2015-12-14 22:23
马赛 发表于 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,多谢提醒~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2