下面是String.intern()方法的Javadoc注释:
*返回字符串对象的规范表示.
最初为空的字符串池由String类私有维护.
调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串.否则,将此String对象添加到池中,并返回对此String对象的引用.
因此,对于任何两个字符串s和t,当且仅当s.equals(t)为真时,s.intern()== t.intern()才为真.
所有文字字符串和字符串值常量表达式都是实体.字符串文字在The Java™Language Specification的3.10.5节中定义."
但我觉得有些事情从jdk-8u102开始改变了.
检查以下示例:
public class Test1 {
public static void main(String[] args) {
String s1 = new String(new char[]{'J', 'a', 'v', 'a'});
String s2 = s1.intern();
System.out.println(s1 == s2);
}
}
Run Code Online (Sandbox Code Playgroud)
如果在JDK 7u80(JDK 7的最后稳定版本)和JDK 8到8u101上运行以上程序,则输出为:
true
但是如果你在JDK 8u102以及JDK 9和JDK 10中运行以上程序,则输出为:
false
为什么intern()方法开始表现不同JDK 8u102以后?
我检查了发行说明和Javadoc注释,但在JDK 8u102中找不到与intern()方法相关的更改.
我查了博客和其他网站,但没有运气.
但是当我尝试使用其他字符串时,输出没有变化:
public class Test2 {
public static void main(String[] args) {
String s3 = new String(new char[]{'U', 'd', 'a', 'y', 'a', 'n'});
String s4 = …Run Code Online (Sandbox Code Playgroud)