比较 Java 中的 Final 字符串与 ==
Java 中的字符串是不可变的,当声明为 Final 时,其行为是唯一的。考虑以下代码:
String str1 = "str"; String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string"); // false
这里,比较返回 false,因为“==”比较对象引用。但是,如果我们将字符串声明为 Final:
final String str1 = "str"; final String str2 = "ing"; String concat = str1 + str2; System.out.println(concat == "string"); // true
现在,比较会莫名其妙地返回 true。
原因
初始化的最终字符串使用编译时常量表达式(如上面的示例),成为常量变量并获得一个独特的属性:它们被保留。驻留意味着共享字符串的唯一实例。
在第二个代码片段中,串联结果“字符串”在编译时被驻留。因此,它与传递给“==”的字符串文字“string”共享相同的引用。这样才能得到真正的比较。
字节码分析
两个版本之间的差异可以从字节码中看出:
结论
最终字符串,其中包含编译时常量表达式Java 是实习的并且共享唯一的实例。当使用“==”比较它们时,这可能会导致意外的结果,因为它直接检查对象引用而不是它们的值。
以上是为什么Java中final字符串的比较`==`有时返回True,有时返回False?的详细内容。更多信息请关注PHP中文网其他相关文章!