对于Java 1.6版,输出为false true
,但对于版本1.8,输出更改为true true
。
有人可以解释为什么会这样吗?
Intern方法用于引用堆中已创建对象的相应字符串常量池,如果该对象不存在,则它将创建String常量池。如果我的理解是错误的,请纠正我。
public class Intern_String2 {
public static void main(String[] args) {
String s1 = new String("durga"); //object created in heap
String s2 = s1.concat("software");
//object durga software created in heap at runtime
String s3 = s2.intern();
// create durga software object in string constant pool as none exist.
System.out.println(s2==s3);//should be false but print true in 1.8 version.
String s4 = "durgasoftware";
System.out.println(s3==s4);//prints true in both version..
}
}
答案 0 :(得分:2)
String.intern()
返回String的规范实例。但它确实允许传递给intern()
的String(例如,调用方法的调用接收器/对象) - 如果String尚未在内部表中,则可能会发生这种情况 - 现在是规范实例。同样,如果该String已经在内部String表中,intern()
将返回它。
String s2 = "web".concat("sarvar");
String s3 = s2.intern();
System.out.println(s2 == s3); // prints "true"
String s4 = "web".concat("sarvar");
String s5 = s4.intern();
System.out.println(s4 == s5); // prints "false"
答案 1 :(得分:1)
我会说这发生在JAVA6,因为字符串池是用PermGen实现的...稍后,在JAVA7,103,106 | 750 | 4
104,105 | 700 | 6
开始使用HEAP内存......
有关详细信息,请参阅此link
答案 2 :(得分:0)
jls确定了什么成为常量池的一部分。字符串文字和String.intern()检索的东西。
当它成为它的一部分时没有真正的规范(首次使用,或者定义文字的类的加载)。它也没有说明什么不成为它的一部分,以及其他什么东西可能被实习。
因此,基于您的实验,我猜他们在Strings成为常量池的一部分时改变了部分。基本上将它从类的加载改为首次使用。所以String.intern()可以返回"这个"同时仍然将这个添加到常量池中,与第一次使用的文字一样成为同一个实例。