1. 程式人生 > >String中的加號和字串拼接的理解

String中的加號和字串拼接的理解

直接看程式碼

            String str1 = new String("abc");
            String str2 = "abc";
            String str3 = "a" + "b" + "c";
            System.out.println(str1.intern() == str2);   //輸出true
            System.out.println(str2 == str3);            //輸出true
輸出的第一個true,已經在另外的文章裡講過了。我們直接來看第二個輸出。

首先需要再次說一點,字串常量是編譯時候確定的,編譯完成,生成class檔案,那就不會再變了。再定義str3的時候,在編譯時候,編譯器會將字串常量直接放在一起,然後查詢常量池裡面,有沒有對應的字串。 所以str2 和 str3 是相等的,也就是指向相同的記憶體區域。

再看如下的程式碼:

            String str1 = "abc";
            String str2 = "ab";
            String str4 = str2 + "c";
            System.out.println(str1 == str4);            //輸出false

在定義str4的時候,是用str2+“c“的形式。這個時候str4的值不是編譯時候能確定的,它已經不再會往常量池存放,是一個字串變數。這個時候,底層是通過StringBuffer的append方法,最終返回new的string。所以str4的地址只的不是常量池區域的地址,而是指向堆記憶體中的區域。