字符串等于评估

时间:2017-01-07 07:56:25

标签: 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);

我认为输出将始终为“==”产生错误,因为使用+运算符将创建一个与执行s4.length相同的新字符串。但预期的答案是不同的。任何人都可以让我知道为什么s == s1给出为真,s3 == s4得到假。

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

1 个答案:

答案 0 :(得分:1)

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

Java语言标准在解释字符串连接上的新对象创建时,小心地对编译时常量字符串表达式进行了例外处理:

  

当在非常量(第15.28节)表达式中使用字符串连接运算符+(第15.18.1节)时,将隐式创建新的类实例,从而生成类型为{{1}的新对象(§4.3.3)。

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