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

在Java版本1.6中,输出是false true ,但是在1.8版本中,输出变为true true

有人能解释为什么会发生这种情况吗?

Intern方法用于引用堆中创建对象的相应字符串常量池,如果该对象不存在,则会创建一个String常量池。 如果我的理解错误,请纠正我。

public class Intern_String2 {

 public static void main(String[] args) {
  // TODO Auto-generated method stub

  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..

 }

String.intern()返回String的规范实例。 但它确实允许你传递给intern()的字符串(例如你调用该方法的call receiver / object)被返回 - 如果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"

我会说这发生在JAVA6上,因为字符串池实现了使用PermGen ...稍后,在JAVA7, String.intern()开始使用HEAP内存...

查看此链接了解更多详情...


jls确定了什么成为常量池的一部分。 字符串文字和由String.intern()检索的东西。

当它成为它的一部分时,没有真正的规范(首次使用,或定义文字的类的加载)。 它也没有说明什么不成为它的一部分,以及其他可能被实施的东西。

所以根据你的实验,我想他们在字符串成为常量池的一部分时改变了这个部分。 基本上将它从装载类改为首次使用。 因此,String.intern()可以返回“this”,同时仍然将这个添加到常量池中,成为与第一次使用的文字相同的实例。

链接地址: http://www.djcxy.com/p/35463.html

上一篇: Intern method concept confusion as output changed with different version

下一篇: virtual call to base class method