package com.zhb.jvm;
/**
*
* @author zhb
*
*/
public class RuntimeConstantPoolOOM {
public static void main(String[] args){
String str1 = "abc";
System.out.println(str1.intern() == str1); //true
String str2 = new String("abcd");
System.out.println(str2.intern() == str2); //false
String str3 =new StringBuilder("math").append("analyze").toString();
System.out.println(str3.intern() == str3); //true
String str4 =new StringBuilder("computer").append("software").toString();
System.out.println(str4.intern() == str4); //true
String str5 =new StringBuilder("jav").append("a").toString();
System.out.println(str5.intern() == str5); //false
}
}
首先我们可以知道intern()方法的定义。 intern 的定义:当调用 intern 方法时,如果池中已包含由 equals(Object) 方法确定的等于 thisString 对象的字符串,则返回池中的字符串。否则,将 thisString 对象添加到池中,并返回对此 String 对象的引用。
str1.intern == str1 为真。这很容易理解。 str2.intern() == str2 这个通过方法的定义也很容易理解。 但为什么 str3.intern() == str3 是 true。事实上,我认为根据定义它是 false。 相反,str5.intern() == str5 为 false。 我在终端中运行命令 java版本 java版本“1.7.0_40” Java(TM) SE 运行时环境(版本 1.7.0_40-b43) Java HotSpot(TM) 64 位服务器 VM(内部版本 24.0-b56,混合模式)
我想得到正确的答案,非常感谢!
最佳答案
why str3.intern() == str3 is true
因为,正如你所说:
Otherwise, thisString object is added to the pool and a reference to this String object is returned.
你就是这种情况。该池尚不包含 str3(即“mathanalyze”)。因此str3被添加到池中并返回。
对于 str5,您处于另一种情况:
if the pool already contains a string equal to thisString object as determined by the equals(Object) method, then the string from the pool is returned
因此,当您的代码执行时,池中已经包含字符串“java”,这并不奇怪,因为 java 是所有标准类的顶级包的名称,也是用于启动 JVM 的可执行文件。在执行 main 方法之前引导应用程序并加载类的代码中很有可能使用文字字符串“java”。
关于java - String.intern() 如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26075658/