java - 字符串等于求值

标签 java string equals

<分区>

我在面试中遇到了如下问题:

String s = "abcde5";
String s1 ="abcde"+"5";
System.out.println(s==s1);
System.out.println(s.equals(s1));
String s4 = "abcd5";
String s3 = "abcd"+s4.length();
System.out.println(s3);
System.out.println(s3.equals(s4));
System.out.println(s3==s4);

我认为对于“==”,输出将始终为 false,因为使用 + 运算符将创建一个与执行 s4.length 相同的新字符串。但预期的答案是不同的。谁能告诉我为什么 s==s1 为真,而 s3==s4 为假。

预期的答案是: 真的 真的 abcd5 真的 假的

最佳答案

s==s1 产生 true 因为 "abcde"+"5" 是常量表达式,即由字符串文字组成的表达式和串联。所有 Java 编译器必须将它们视为单个文字,即就好像 + 不存在一样。

Java 语言标准在解释在字符串连接上创建新对象时小心地将编译时常量字符串表达式作为异常(exception):

A new class instance is implicitly created when the string concatenation operator + (§15.18.1) is used in a non-constant (§15.28) expression, resulting in a new object of type String (§4.3.3).

表达式 "abcd"+s4.length() 另一方面,不是常量表达式。这就是为它创建一个新对象的原因,导致 s3==s4 产生 false

关于java - 字符串等于求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41519200/

相关文章:

php - 用引号将字符串括起来

python - 斜杠在python字符串和正则表达式中的使用

Java 字符串不等于

java - equals(Object o) 和 equals(Name o) 之间有什么有意义的区别吗?如果是,它有什么含义?

java - 无法解析 bean driverClassName

java - 解析wireMock中的动态路径

c++ - 仅在 C++ 源文件中查找字符串的正则表达式

sql - SQL JOIN:开与等于

Java Swing UIManager 与 tableHeaderUI

Java Arraylist 改变影响其他变量