58同城的java字符串常量池

面试题code

public class StringPool58Demo {
    public static void main(String[] args) {

        String str1 = new StringBuilder("58").append("tongcheng").toString();
        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()方法

58同城的java字符串常量池

58同城的java字符串常量池

why

按照代码结果,java字符串答案为false 必然是两个不同的java,那另外一个java字符串如何加载进来的?

为什么

有一个初始化的java字符串(JDK出娘胎自带的), 在加载sun.misc.Version这个类的时候进入常量池

OpenJDK8底层源码说明

递推步骤

System代码解析

System —> initializeSystemClass --> Version

58同城的java字符串常量池

58同城的java字符串常量池

类加载器和rt.jar

根加载器提前部署加载rt.jar

58同城的java字符串常量池

OpenJDK8源码

  1. http://openjdk.java.net/
  2. openjdk8\jdk\srclshare\classes\sun\misc

总结

58同城的java字符串常量池

考查点

intern()方法,判断true/false?

《深入理解java虚拟机》书原题 是否读过经典JM书籍

58同城的java字符串常量池

上一篇:kafka window 操作


下一篇:剑指 Offer 58 - I. 翻转单词顺序