黑马程序员技术交流社区

标题: string 类的判断误区你知道吗?求大神指点迷津!!! [打印本页]

作者: adminlxb    时间: 2015-5-18 22:44
标题: string 类的判断误区你知道吗?求大神指点迷津!!!
eg:
1、System.out.println(“abc”==”ab”+”c”);  true

  2、String s3 = “你好吗”;
       String s4 =”你”;
      String s5 =”好吗”;
      System.out.println(s3==(s4+s5))   false

为什么?两者区别在哪里?最好有详细的推理答案。————求解!急!急!急!


作者: pvbj0314    时间: 2015-5-22 21:33
在《Java语言规范中文版(第三版)》中有如下描述:
字符串串接运算符+
如果只有一个操作数表达式的类型是String,那么字符串转换就在另一个操作数上执行,以便在运行时产生字符串。结果是Sring对象[新创建,除非表达式是一个编译时常量表达式]的一个引用,该对象是两个操作数字符串的串接。对应的英文文档The Java® Language Specification (Java SE 7 Edition)中有如下原文:
If only one operand expression is of type String, then string conversion (§5.1.11) is performed on the other operand to produce a string at run time.
The result of string concatenation is a reference to a String object that is the concatenation of the two operand strings. The characters of the left-hand operand precede the characters of the right-hand operand in the newly created string.
The String object is newly created (§12.5) unless the expression is a compile-time constant expression (§15.28).
在一份名为《黑马程序员入学Java知识(精华总结)》的文档中有如下描述:
使用只包含常量的字符串连接符如"aa" + "bb"创建的也是常量,编译期就能确定,已经确定存储到常量池中;
使用包含变量的字符串连接符如"aa" + s1 创建的对象是运行期才创建的,存储在堆中;
以上三份资料,都说明了同样的结果,相信对你会有所帮助。列出参考,一是因为它们可以从网上获取,二是可以有所依据。


作者: 白水丶    时间: 2015-5-22 21:37
楼上答得太专业了,我觉得就是常量跟变量的区别吧
作者: 守株人    时间: 2015-5-22 21:58
1楼解答很厉害,赞一个
作者: sss18310878521    时间: 2015-5-22 22:28
第一个:在java中"ab"+"c"虚拟机会自动编译成“abc”,即:几个字符串常量连接时会自动编译成一个合并后的字符串。对于第二个:S3,S4,S5都是在常量池中创建的对象,他们三个本身就不同,怎么可能会相等呢




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