小编典典

字符串比较混乱

java

在继续之前: 我知道我们应该使用.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相同,现在都是“字符串”。它应该为true,但最终为 false

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”); // true

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


阅读 215

收藏
2020-11-26

共1个答案

小编典典

仅保证字符串 文字 和常量表达式被池化。由于str1 + str2不是文字,因此由JVM决定是否保留结果。您可以通过intern()已发现的电话强制它。

在Java语言规范的第3.10.5节中定义:

字符串文字是对类实例的引用String(第4.3.1节,第4.3.3节)。

而且,字符串文字总是引用class的相同实例String。这是因为使用方法将字符串文字(或更广泛地说,是作为常量表达式的值的字符串(第15.28节))“插入”以便共享唯一的实例String.intern

您的第二个示例,"str" + "ing"是一个常量表达式,因此可以确保将其内联。

另请参阅JavaDocString.intern

这是试图解释发生了什么。编写良好的代码应该永远不要依赖于此,而应始终使用该equals方法。任何合理的JRE都会有类似的支票

if (this == other)
  return true;

非常接近String.equals性能明智的最高标准,这无关紧要。

2020-11-26