首页 >Java >java教程 >为什么Java中final字符串的比较`==`有时返回True,有时返回False?

为什么Java中final字符串的比较`==`有时返回True,有时返回False?

Susan Sarandon
Susan Sarandon原创
2024-11-30 16:42:14232浏览

Why Does `==` Comparison of Final Strings in Java Sometimes Return True and Sometimes False?

比较 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”共享相同的引用。这样才能得到真正的比较。

字节码分析

两个版本之间的差异可以从字节码中看出:

  • 非-最终版本:创建 StringBuilder 并在运行时连接字符串,创建一个新的 String 对象。
  • Final version:在编译时内联连接字符串“string”,直接使用引用的实习实例。

结论

最终字符串,其中包含编译时常量表达式Java 是实习的并且共享唯一的实例。当使用“==”比较它们时,这可能会导致意外的结果,因为它直接检查对象引用而不是它们的值。

以上是为什么Java中final字符串的比较`==`有时返回True,有时返回False?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn