Java_String_String常量池

package deep;

public class StringTest {
    public static void main(String[] args) {
        final String fs = "Java";
        String s = "Java";
        final int fi = 7;
        int i = 7;
        String s1 = "JavaSE7";
        String s2 = "Java" + "SE" + "7";
        String s3 = fs + "SE" + "7";
        String s4 = s + "SE" + "7";
        String s5 = fs + "SE" + 7;
        String s6 = fs + "SE" + fi;
        String s7 = fs + "SE" + i;
        System.out.println("s1 == s2:" + (s1 == s2));
        System.out.println("s1 == s3:" + (s1 == s3));
        System.out.println("s1 == s4:" + (s1 == s4));
        System.out.println("s1 == s5:" + (s1 == s5));
        System.out.println("s1 == s6:" + (s1 == s6));
        System.out.println("s1 == s7:" + (s1 == s7));
    }
}

運行結果:
s1 == s2:true
s1 == s3:true
s1 == s4:false
s1 == s5:true
s1 == s6:true
s1 == s7:false

對於s4而言,由於s不是final的,因此s指向的String對象在編譯期間不能確定,雖然在程序中指向“Java”,但是沒有人能夠保證s所指向的地址不會變,所以s1 == s4爲false,同理s7的i不是final的,也爲false。

要點總結:

  • String類維護一塊特殊的區域,稱爲常量池。因爲String對象是不可改變的,因此沒有必要創建兩個相同的String對象。只需將String對象加入常量池,在需要的時候取出,這樣即可實現String對象的共享。
  • 在程序中出現String編譯時常量(String字面常量與String常量表達式)時,會自動調用intern方法,如果常量池中含有相等的String對象,則直接返回常量池中的對象,否則將對象加入常量池中並返回該對象。
  • 對於運行時創建的String對象(非String編譯時常量),會分配到堆中,系統不會自動調用intern方法拘留該對象,不過我們依然可以自行調用該對象的intern方法對該對象進行拘留。
發佈了133 篇原創文章 · 獲贊 11 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章