将字符串与==中的Java进行比较

问题:

我有一个关于Java中的字符串的简单问题。以下段的简单代码只是连接两个字符串,然后将它们与==

String str1="str";
String str2="ing";
String concat=str1+str2;

System.out.println(concat=="string");

比较表达式concat=="string"返回false是明显的(我理解equals()==之间的差异)。
当这两个字符串如此声明为final时,

final String str1="str";
final String str2="ing";
String concat=str1+str2;

System.out.println(concat=="string");

比较表达式concat=="string"在这种情况下返回true。为什么final有所作为?是否必须在实习池中做某事,或者我只是被误导?

回答:

当您将String(其为immutable)变量声明为final,并使用编译时常量表达式初始化时,它也将变为编译时常量表达式,编译器的值由编译器内联它被使用。因此,在第二个代码示例中,在内联值之后,编译器将字符串连接转换为:

String concat = "str" + "ing";  // which then becomes `String concat = "string";`

当与"string"相比时,会给你true,因为字符串文字是interned
JLS §4.12.4 – final Variables

原始类型或类型String的变量final被编译时常数表达式(§15.28)初始化,称为constant variable

也来自JLS §15.28 – Constant Expression:

类型String的编译时常数表达式始终为“interned”,以便共享唯一实例,使用方法String#intern()

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Comparing strings with == which are declared final in Java

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 51 = 52