String中的加號和字串拼接的理解
阿新 • • 發佈:2019-02-05
直接看程式碼
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的地址只的不是常量池區域的地址,而是指向堆記憶體中的區域。