1. 程式人生 > >Java學習筆記 (十三) String究竟建立了幾個物件 以及String的intern方法

Java學習筆記 (十三) String究竟建立了幾個物件 以及String的intern方法

String究竟建立了幾個物件
看程式碼:

例 1、


    public static void main(String[] args) {

        String s3 = "天道酬勤";

        String s4 =new String("天道酬勤");

        System.out.println("s3==s4 "+(s3==s4));//false

    }

以上程式碼執行結果為false,證明建立了兩個物件。
第一次建立物件是出現 字串 “天道酬勤” 的時候,虛擬機器會載入天道酬勤到常量池,第二次建立物件是new String(“天道酬勤”) 的時候在堆記憶體建立了一個物件。
而 == 比較的是物件的地址值,所以他們不相等。

例2、

    public static void main(String[] args) {

        String s4 =new String("天道")+new String("酬勤");
        String s2=s4.intern();
        String s3 = "天道酬勤";
        System.out.println("s3==s4 "+(s3==s4));//true
        System.out.println("s2==s4 "+(s2==s4));//true
        System.out.println("s3==s2 "
+(s3==s2));//true }

此時s2==s3==s4,為什麼呢,因為 s4的值為天道酬勤,而 s4.intern方法,會去常量池裡找天道酬勤,但是s4的天道酬勤是在堆記憶體中的,常量池裡並沒有天道酬勤。
當一個String例項呼叫intern()方法時,Java會去查詢常量池中是否有相同Unicode的字串常量,如果有,則返回其的引用,如果沒有,則把String例項放進常量池,並返回引用。
所以 s2==s3==s4

例3、

    public static void main(String[] args) {

        String s3 = "天道酬勤"
; String s4 =new String("天道")+new String("酬勤"); String s2=s4.intern(); System.out.println("s3==s4 "+(s3==s4));//false System.out.println("s2==s4 "+(s2==s4));//false System.out.println("s3==s2 "+(s3==s2));//true }

當我們改變下他們的位置,結果截然不同,因為s3字串已經存在常量池裡,而s4.intern方法返回的是常量池的天道酬勤的引用,所以s2==s3 != s4.

參考資料