1. 程式人生 > 其它 >JVM_字串常量池地址問題

JVM_字串常量池地址問題

先看下程式碼
public class JVMDemo {
    public static void main(String[] args) {
        String s1 = "ab";
        //new String() -> jdk1.8後永遠指向常量池中的引用(沒有就在常量池中建立,不會把s2複製到常量池(區別jdk1.6))
        String s2 = new String("ab");
        String s3 = new String("a") + new String("b");
        String s4 = "a";
        String s5 = "b";
        String s6 = s4 + s5;
        String s7 = "a" + "b";
        String s8 =  s4 + "b";

        System.out.println(s1 == s2);//false
        System.out.println(s1 == s3);//false
        System.out.println(s1 == s6);//false
        System.out.println(s1 == s7);//true
        System.out.println(s1 == s8);//false
        System.out.println(s2 == s6);//false
        System.out.println(s2 == s7);//false
        System.out.println(s2 == s8);//false
        System.out.println(s2.intern() == s3.intern());//true
        System.out.println(s2.intern() == s6.intern());//true
        System.out.println(s2.intern() == s8.intern());//true
        System.out.println(s2.intern() == s1);//true
        System.out.println(s2.intern() == s7);//true
    }

}

1、s1為字串常量,取自常量池中,所有取自常量池中相等的值最終地址都相等。(在jdk1.7之後常量池放在了堆中)

所有字面量字串均存放在常量池中,一旦有變數的加入,則會在堆中建立物件。

2、String s8 = s4 + "b"中的+到底做了什麼

new StringBuilder(s4).append("b").toString()

3、String.intern()的作用是什麼

String.intern() --> 返回一個字串,內容與此字串相同,若常量池裡有相同字串則返回池中字串的引用,若沒有則將其複製一份新增進池中再返回池中字串的引用。

4、String s2 = new String("ab");
做了什麼

jdk1.6中:先判斷常量池中是否有"helloworld",如果有直接返回常量池中的地址,如果沒有則拷貝一份s2物件放入常量池(此時,new String仍指向原來堆中的地址)
jdk1.8中:先判斷常量池中是否有"helloworld",如果有直接返回常量池中的地址,如果沒有則將該物件放入常量池中。(此時,new String已經指向了常量池中的helloworld的地址)