实习方法概念混淆作为输出随着不同版本而改变

时间:2016-07-20 19:52:30

标签: java string

对于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..      
 }
}

3 个答案:

答案 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()可以返回"这个"同时仍然将这个添加到常量池中,与第一次使用的文字一样成为同一个实例。