我在面试中遇到了如下问题:
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
。