我正在接受采访并得到如下问题:
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);
我认为输出将始终为“==”产生错误,因为使用+运算符将创建一个与执行s4.length相同的新字符串。但预期的答案是不同的。任何人都可以让我知道为什么s == s1给出为真,s3 == s4得到假。
预期答案是: 真正 真正 abcd5 真正 假
答案 0 :(得分:1)
s==s1
产生true
因为"abcde"+"5"
是一个常量表达式,即由字符串文字和连接组成的表达式。所有Java编译器必须将它们视为单个文字,即好像+
不存在。
Java语言标准在解释字符串连接上的新对象创建时,小心地对编译时常量字符串表达式进行了例外处理:
当在非常量(第15.28节)表达式中使用字符串连接运算符
+
(第15.18.1节)时,将隐式创建新的类实例,从而生成类型为{{1}的新对象(§4.3.3)。
另一方面,表达式String
不是常量表达式。这就是为它创建一个新对象的原因,导致"abcd"+s4.length()
产生s3==s4
。