【发布时间】:2014-11-22 09:57:44
【问题描述】:
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 对象的字符串,由 equals(Object) 方法确定,则返回池中的字符串。否则,将 thisString 对象添加到池中并返回对该 String 对象的引用。
str1.intern == str1 是真的。这很容易理解。 str2.intern() == str2 这个通过方法的定义也很容易理解。 但是为什么 str3.intern() == str3 是真的。其实我认为按照定义是假的。 相反,str5.intern() == str5 是假的。 我在终端中运行命令 java版本 java版本“1.7.0_40” Java(TM) SE 运行时环境 (build 1.7.0_40-b43) Java HotSpot(TM) 64 位服务器 VM(内部版本 24.0-b56,混合模式)
我想获得正确答案。非常感谢!
【问题讨论】:
-
重新打开 - 尚不清楚 marked duplicate 如何解决此处观察到的行为...(至少,它肯定不明显...)