在继续之前: 我知道我们应该使用.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
不应该来自字符串池吗?有人可以帮忙解释一下吗?
仅保证字符串 文字 和常量表达式被池化。由于str1 + str2不是文字,因此由JVM决定是否保留结果。您可以通过intern()已发现的电话强制它。
str1 + str2
intern()
这在Java语言规范的第3.10.5节中定义:
字符串文字是对类实例的引用String(第4.3.1节,第4.3.3节)。 而且,字符串文字总是引用class的相同实例String。这是因为使用方法将字符串文字(或更广泛地说,是作为常量表达式的值的字符串(第15.28节))“插入”以便共享唯一的实例String.intern。
字符串文字是对类实例的引用String(第4.3.1节,第4.3.3节)。
String
而且,字符串文字总是引用class的相同实例String。这是因为使用方法将字符串文字(或更广泛地说,是作为常量表达式的值的字符串(第15.28节))“插入”以便共享唯一的实例String.intern。
String.intern
您的第二个示例,"str" + "ing"是一个常量表达式,因此可以确保将其内联。
"str" + "ing"
另请参阅JavaDocString.intern。
这是试图解释发生了什么。编写良好的代码应该永远不要依赖于此,而应始终使用该equals方法。任何合理的JRE都会有类似的支票
equals
if (this == other) return true;
非常接近String.equals性能明智的最高标准,这无关紧要。
String.equals