gpt4 book ai didi

java - 字符串比较混淆

转载 作者:行者123 更新时间:2023-12-03 23:00:14 25 4
gpt4 key购买 nike

在我们继续之前:我知道我们应该使用 .equals() 来比较内容。我现在只是在谈论以下场景的实际引用是否相同......

假设我们有以下内容:

String str1 = "str";
String str2 = "string";
String str3 = "ing";
String str4 = str1 + str3;
str1 = str4;
String str5 = "string";
System.out.println(str1==str2);//false

我认为它应该是真的,因为在字符串池中,对“字符串”的引用应该是相同的,因为 str1 和 str2 现在都是“字符串”。它应该是真的,但最终变成了

System.out.println(str1.intern()==str2.intern());//true

我试过了,这次它返回了一个true。然后我尝试了:

System.out.println(str1==str5);//false
System.out.println(str2==str5);//true

还有 System.out.println("str"+"ing"=="string");//真

不是应该来自字符串池吗?有人可以帮忙解释一下吗?

最佳答案

只有字符串文字和常量表达式保证被池化。由于 str1 + str2 不是文字,因此是否保留结果取决于 JVM。正如您已经发现的那样,您可以通过调用 intern() 来强制执行它。

这是在 § 3.10.5 of the Java Language Specification 中定义的:

A string literal is a reference to an instance of class String (§4.3.1, §4.3.3).

Moreover, a string literal always refers to the same instance of class String. This is because string literals – or, more generally, strings that are the values of constant expressions (§15.28) – are “interned” so as to share unique instances, using the method String.intern.

你的第二个例子,"str"+ "ing",是一个常量表达式,所以它保证被保留。

另见 the JavaDoc for String.intern .

这是试图解释正在发生的事情。编写良好的代码可能永远不会依赖于此,而应始终使用 equals 方法。任何合理的 JRE 都会有这样的检查

if (this == other)
return true;

非常接近 String.equals 的顶部,因此在性能方面,它应该无关紧要。

关于java - 字符串比较混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26693369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com