【问题标题】:Comparing static final String using ==使用 == 比较静态最终字符串
【发布时间】:2023-02-11 02:35:28
【问题描述】:
public static final String FOO = "foo";
public String func1() {
return FOO;
}
if(func1() == FOO) ....
Java 保证总是返回 true 吗?或者编译器可以内联字符串,而不是实习/记忆字符串,然后它可能会返回 false,因为编译器创建了两个不同的对象?
还是 static final 保证它使用定义的字符串对象,并且不会内联文本?
【问题讨论】:
标签:
java
string
object
static
final
【解决方案1】:
通常不建议在 Java 中使用 == 运算符比较两个静态最终 String 对象。 == 运算符比较两个对象的内存地址,看它们是否引用同一个对象,但 static final String 对象不是这样。
当您在 Java 中声明一个 static final String 变量时,JVM 将池化字符串文字的所有实例,因此对同一个字符串文字的多个引用将引用内存中的同一个对象。但是,当你使用 new 操作符创建一个 String 对象时,它会在内存中创建一个新对象,即使字符串值相同。
因此,在比较static final String对象时,推荐使用.equals()方法,比较的是两个对象的内容,而不是内存地址。这将确保比较正确完成并提供预期的结果。
【解决方案2】:
据我所知,这将返回 true。当使用文字 " 制作字符串时,字符串池将返回具有指定内容的现有字符串的实例(如果存在)。
在这种情况下,代码也可以是
public String func1() {
return "foo";
}
if (func1() == "foo") ...
, 文字是相同的,这意味着由文字产生的字符串实例也将是相同的