黑马程序员技术交流社区

标题: 【问题已解决】关于String的一些问题,求解释 [打印本页]

作者: 刘悦    时间: 2012-8-8 17:00
标题: 【问题已解决】关于String的一些问题,求解释
本帖最后由 刘悦 于 2012-8-8 22:05 编辑
  1. String s1="abcde";
  2. String s2="de";
  3. String s3="abc"+"de";
  4. String s4="abc"+s2;
  5. final String s5="de";
  6. String s6="abc"+s5;

  7. System.out.println(s1==s3);
  8. System.out.println(s1==s4);
  9. System.out.println(s1==s6);
复制代码
运行结果是
true
false
true
小弟知道,第一个结果是因为编译器在编译期间通过编译优化,在class文件中s3其实已经是"abcde",所以相等是无可厚非。
小弟很疑惑,为什么第二个会显示false。而第三个会是true。
小弟很想不通,请各位大哥大姐能替小弟解答一下疑惑,小弟不胜感激~~~~



很感谢各位同学解答,此【问题已解答】,就此结贴
作者: 刘悦    时间: 2012-8-8 18:55
小弟在线求解释
作者: 黄基焜    时间: 2012-8-8 19:10
我不知你是如何编译成功的。我编译你这个东西的时候是失败的。

03.String s3="abc"+"de" 少了个分号
还有:
05.Final String s5="de";
错误
作者: 刘悦    时间: 2012-8-8 19:20
黄基焜 发表于 2012-8-8 19:10
我不知你是如何编译成功的。我编译你这个东西的时候是失败的。

03.String s3="abc"+"de" 少了个分号

不好意思,我写得急了,f给大写了……不好意思,谢谢你谢谢你,帖子已修改,结果是可以正常运行的
作者: 黄珊珊    时间: 2012-8-8 19:58
要明白这个问题,首先要清楚Java里面的字符串的比较形式有两种,一种是“==”,另一种是equals。“==”比较的是引用是否相同,虽然S1和S4的值相同,但是内存引用不同,所以为flase;如果换成s1.equals(s4)则会为true,因为equals比较的就是值是否相同。
为何第三个是true呢,因为关键字final的缘故。
如果将它的final去掉也会变成flase。同理如果我将代码String s2="de";变成final String s2="de"; 最后的S1与S4的结果也会为true.
作者: 黑马张涛    时间: 2012-8-8 20:19
01.String s1="abcde";
02.String s2="de";
03.String s3="abc"+"de";
04.String s4="abc"+s2;
05.final String s5="de";
06.String s6="abc"+s5;//s5加上final修饰符就变成常量,这句话变成和第三句一样了!
作者: lsle    时间: 2012-8-8 21:01
黄珊珊 发表于 2012-8-8 19:58
要明白这个问题,首先要清楚Java里面的字符串的比较形式有两种,一种是“==”,另一种是equals。“==”比较 ...

为什么s1和s3的引用是相同的?
又为什么加上final就会使引用相同?
作者: 刘渝灵    时间: 2012-8-8 21:19
加了final的是常量,没加的是变量。String s6="abc"+s5;两个常量相加自然是常量,字符串常量池中有取出即可。所以s6和s1是同一个对象。String s4="abc"+s2;这种,但凡=右边出现了变量(比如s2)都会新建一个String对象。比如 String s1="abc" ,s2="a",s3="bc",s4=s2+s3.这里s4和s1也不是同一个对象。
作者: 刘悦    时间: 2012-8-8 22:02
问题得以解决,首先感谢 黄基焜 同学为在下指出了错误,谢谢
黄珊珊 同学的解释很通俗易懂,看到这里其实明白了,谢谢
黑马张涛 同学为在下提供了思路,这里用final其实就是在编译过程中把数据引入常量池了吧,所以两者相等本人的理解是这样的
刘渝灵 同学,回答简单明了,很有自己见解啊,真心受教了!

谢谢你们,此贴已解决,就此结贴




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