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方法时,如果池中已经包含了一个等于thisString对象的字符串,则返回来自这个池的字符串。否则,将thisString对象添加到池中,并返回对此字符串对象的引用。
实习生== str1是真的。这很容易理解。str2.intern() == str2 --这个方法的定义也很容易理解。但是,为什么str3.intern() == str3是true.in事实,我认为定义是错误的。相反,str5.intern() == str5是假的。我在终端java -version java版本"1.7.0_40“1.7.0_40(TM) SE运行时环境(build 1.7.0_40-b43)中运行命令,Java HotSpot(TM) 64位服务器VM (build 24.0-b56,混合模式)
我非常想得到正确的answer.thank你!
发布于 2014-09-27 14:42:26
为什么str3.intern() == str3是真的
因为,就像你说的:
否则,将thisString对象添加到池中,并返回对此字符串对象的引用。
你在这种情况下。池还不包含str3 (即“数学分析”)。因此,str3被添加到池中并返回。
对于str5,则是另一种情况:
如果池中已经包含了一个等于thisString对象的字符串,则返回池中的字符串。
因此,在执行代码时,池中已经包含了字符串" java“,这并不奇怪,因为java是所有标准类的顶级包的名称,也是用于启动JVM的可执行文件的名称。在执行main方法之前,在引导应用程序和加载类的代码中很有可能使用文字字符串"java“。
发布于 2014-09-27 14:42:27
在我看来,我认为字符串"java"在池中是默认的。实际上,当您在str3上调用intern()时,这个单词还没有在池中,所以它被添加了,返回的引用是str3 (没有创建新的对象),所以测试给出了真。相反,"java"已经在池中,因此它返回池中对象的引用,这与str5的引用不同。
请注意,不仅对"java",而且对所有单个字符,您都将观察到相同的行为。
发布于 2014-09-27 14:40:53
测试foo.intern() == foo是一种测量foo在调用intern()之前是否已经在池中的方法。因此,str3.intern() == str3意味着str3还没有在池中。就这样。
运行时的某个地方可能有一个常量字符串"java",在复制之前加载到池中,这就是为什么str5.intern() != str5。
下面是我在迎接OpenJDK 8源代码时发现的最明显的情况:
./com/sun/beans/decoder/DocumentHandler.java: setElementHandler("java", JavaElementHandler.class); // NON-NLS: the element name
./com/sun/tools/example/debug/gui/JDBMenuBar.java: JDBFileFilter filter = new JDBFileFilter("java", "Java source code");
./com/sun/tools/jdi/SunCommandLineLauncher.java: "java",
./sun/launcher/LauncherHelper.java: (progname == null) ? "java" : progname ));
./sun/rmi/server/Activation.java: File.separator + "bin" + File.separator + "java";
./sun/rmi/server/Activation.java: command[0] = "java";https://stackoverflow.com/questions/26075658
复制相似问题