天天看點

尚矽谷面試題第三季

java字元串常量池

package atguigu.demo1;

public class StringPool58Demo {
    public static void main(String[] args) {
        String str1 = new StringBuilder("58").append("tongcheng").toString();
        System.out.println(str1);

        /**
          1、str1.intern():(1)本地方法
                            (2)如果字元串常量池中已經包含了一個等于此String對象的字元串,則傳回常量池中得到這個字元串對象的引用
                             如果沒有則加入字元串常量池
                            (3)注意進入intern()源碼看注釋
         2、System[進入源碼看注釋可知] ----》initializeSystemClass()[方法裡面有一個sun.misc.Version.init();] --->進入init()方法----->
            是一個Version類,裡面有一個 private static final String launcher_name = "java";靜态常量。

         3、sun.misc:這個包是在bootstrap根加載器加載位元組碼檔案的時候,就把這個包下的類都加載進去,包含:Object類。String類等

         4、是以、下面的java字元串才會出現false,一個是你自己建立的,一個是jvm開始時就加載進去的
         **/

        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());

        /**
           這個為false的原因:有一個初始化的java字元串(jdk從娘胎自帶的)
            在加載sun。misc.version這個類的時候進入的常量池
         **/

        System.out.println(str2==str2.intern());
    }
}
           
結果:

58tongcheng
58tongcheng
true

java
java
fals
           
尚矽谷面試題第三季
尚矽谷面試題第三季