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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

eg:
1、System.out.println(“abc”==”ab”+”c”);  true

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

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

4 个回复

正序浏览
第一个:在java中"ab"+"c"虚拟机会自动编译成“abc”,即:几个字符串常量连接时会自动编译成一个合并后的字符串。对于第二个:S3,S4,S5都是在常量池中创建的对象,他们三个本身就不同,怎么可能会相等呢
回复 使用道具 举报
1楼解答很厉害,赞一个
回复 使用道具 举报
楼上答得太专业了,我觉得就是常量跟变量的区别吧
回复 使用道具 举报
在《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 创建的对象是运行期才创建的,存储在堆中;
以上三份资料,都说明了同样的结果,相信对你会有所帮助。列出参考,一是因为它们可以从网上获取,二是可以有所依据。

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