JVM(StringTable)代码详解

作者: 秋波未央 | 来源:发表于2019-12-14 21:02 被阅读0次

package stringTable;

//StringTable["a" "b" ] hashtable 结构

不能扩容

public class demo {

//常量池中的信息,都会被加载到运行时常量池中,这时 a b ab 都是常量池中的符号,还没有变为java字符串对象

//ldc #2 会把 a符号变为"a"字符串对象,"a"与StringTable中对象进行比对,若没有与它相同的对象

//它将会被放入StringTable(字符串表)中,若有它将会使用StringTable(字符串表)中的对象。

//ldc #3 会把 b符号变为"b"字符串对象,"b"与StringTable中对象进行比对,若没有与它相同的字符

//它将会被放入StringTable(字符串表)中,若有它将会使用StringTable(字符串表)中的对象。

/**

  * @param args

  */

public static void main(String[] args) {

  // TODO Auto-generated method stub

  String s1="a";

  String s2="b";

  String s5="ab";

  String s3="a"+"b";//javac在编译期间的优化,结果已经在编译期间确定为ab

  String s4=s1+s2;//new StringBuilder().append("a").append("b").toString() new String("ab")

  String s6=s4.intern();

  //问:

  System.out.println(s3==s4);//s3中的对象是StringTable中的对象,s4中的对象是新创建的对象,因此他们两个不相等,打印false.

  System.out.println(s3==s5);//两者在创建对象时都使用的是StringTable中的对象,因此他们两个是相等的,打印true。

  System.out.println(s3==s6);

 

  String x2=new String("c")+new String("d");

  String x1="cd";

  x2.intern();

 

  //问,如果调换了【最后两行代码】位置呢?如果是JDK1.6呢?

  System.out.println(x1==x2);

}

}

判断结果:false、true、true、false

相关文章

网友评论

    本文标题:JVM(StringTable)代码详解

    本文链接:https://www.haomeiwen.com/subject/acyhnctx.html