字符串常量是在类加载还是在实际执行代码时才加载入运行时常量池?

今天纠结了一个问题,就是字符串常量是在类加载还是在实际执行代码时才加载入运行时常量池?

以下面的具体例子为例,环境为jdk1.8

public class Demo {
    
    public static void main(String[] args) {
        String s1= "a"+ "a";
        s1.intern();
        String s2= "aa";
        System.out.println(s1 == s2);
    }
    
}

运行结果时true,说明类加载时并没有加载方法体内的字符串常量aa

public class Demo {
    
    public String s = "aa";
    
    public static void main(String[] args) {
        String s1= "a"+ "a";
        s1.intern();
        String s2= "aa";
        System.out.println(s1 == s2);
    }
    
}

运行结果同样是时true,说明类加载时并没有加载类变量的字符串常量aa

深入理解Java虚拟机的P42页讲到Class文件中的各种字面量和符号引用将在类加载后进入方法区的运行时常量池中存放。

这句话和我写的例子不符合,网上查找了很多博客也没有找到类似的问题和解释。

1码归1码共同探讨

 

原文地址:https://www.cnblogs.com/lzxin/p/10389304.html