面试题code

public class StringPool58Demo {
    public static void main(String[] args) {
        String str1 = new StringBuilder("58").append("tongcheng").toString();//58 tongcheng换成ali baba,zi jie,mei tuan,re dis 都是true
        System.out.println(str1);
        System.out.println(str1.intern());
        System.out.println(str1 == str1.intern());

        System.out.println();

        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2);
        System.out.println(str2.intern());
        System.out.println(str2 == str2.intern());

    }
}

讲解

intern()方法

  • 源码+解释
    image-1667174691630
    image-1667174700729

why

  • 按照代码结果,java字符串答案为false
  • 必然是两个不同的java,那另外一个java字符串如何加载进来的?
  • 为什么
    • 有一个初始化的java字符串(JDK出娘胎自带的),在加载sun.misc.Version这个类的时候进入常量池

OpenJDK8底层源码说明

  • 递推步骤
    • System代码解析
      • System
        image-1667174812366
        • initializeSystemClass
          image-1667174856122
          • Version
            image-1667174870739
    • 类加载器和rt.jar
      • 根加载器提前部署加载rt.jar
        image-1667174894903
    • OpenJDK8源码

考查点

  • intern()方法,判断true/false?
    • 《深入理解Java虚拟机》书原题,是否读过经典JVM书籍
      image-1667174958633