字符串等于求值

String equals Evaluate

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

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 语言标准在解释在字符串连接上创建新对象时小心地将编译时常量字符串表达式作为例外:

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.