深入理解String、StringBuffer、StringBuilder區別和底層實現
阿新 • • 發佈:2018-12-14
public static void main(String[] args) {
/**
* 情景一:字串池
* JAVA虛擬機器(JVM)中存在著一個字串池,其中儲存著很多String物件;
* 並且可以被共享使用,因此它提高了效率。
* 由於String類是final的,它的值一經建立就不可改變。
* 字串池由String類維護,我們可以呼叫intern()方法來訪問字串池。
*/
String s1 = "abc";
//↑ 在字串池建立了一個物件
String s2 = "abc";
//↑ 字串pool已經存在物件“abc”(共享),所以建立0個物件,累計建立一個物件
System.out.println("s1 == s2 : "+(s1==s2));
//↑ true 指向同一個物件,
System.out.println("s1.equals(s2) : " + (s1.equals(s2)));
//↑ true 值相等
//↑------------------------------------------------------over
/**
* 情景二:關於new String("")
*
*/
String s3 = new String("abc");
//↑ 建立了兩個物件,一個存放在字串池中,一個存在與堆區中;
//↑ 還有一個物件引用s3存放在棧中
String s4 = new String("abc");
//↑ 字串池中已經存在“abc”物件,所以只在堆中建立了一個物件
System.out.println("s3 == s4 : " +(s3==s4));
//↑false s3和s4棧區的地址不同,指向堆區的不同地址;
System.out.println("s3.equals(s4) : "+(s3.equals(s4)));
//↑true s3和s4的值相同
System.out.println("s1 == s3 : "+(s1==s3));
//↑false 存放的地區多不同,一個棧區,一個堆區
System.out.println("s1.equals(s3) : "+(s1.equals(s3)));
//↑true 值相同
//↑------------------------------------------------------over
/**
* 情景三:
* 由於常量的值在編譯的時候就被確定(優化)了。
* 在這裡,"ab"和"cd"都是常量,因此變數str3的值在編譯時就可以確定。
* 這行程式碼編譯後的效果等同於: String str3 = "abcd";
*/
String str1 = "ab" + "cd"; //1個物件
String str11 = "abcd";
System.out.println("str1 = str11 : "+ (str1 == str11));
//↑------------------------------------------------------over
/**
* 情景四:
* 區域性變數str2,str3儲存的是儲存兩個拘留字串物件(intern字串物件)的地址。
*
* 第三行程式碼原理(str2+str3):
* 執行期JVM首先會在堆中建立一個StringBuilder類,
* 同時用str2指向的拘留字串物件完成初始化,
* 然後呼叫append方法完成對str3所指向的拘留字串的合併,
* 接著呼叫StringBuilder的toString()方法在堆中建立一個String物件,
* 最後將剛生成的String物件的堆地址存放在區域性變數str3中。
*
* 而str5儲存的是字串池中"abcd"所對應的拘留字串物件的地址。
* str4與str5地址當然不一樣了。
*
* 記憶體中實際上有五個字串物件:
* 三個拘留字串物件、一個String物件和一個StringBuilder物件。
*/
String str2 = "ab"; //1個物件
String str3 = "cd"; //1個物件
String str4 = str2+str3;
String str5 = "abcd";
System.out.println("str4 = str5 : " + (str4==str5)); // false
//↑------------------------------------------------------over
/**
* 情景五:
* JAVA編譯器對string + 基本型別/常量 是當成常量表達式直接求值來優化的。
* 執行期的兩個string相加,會產生新的物件的,儲存在堆(heap)中
*/
String str6 = "b";
String str7 = "a" + str6;
String str67 = "ab";
System.out.println("str7 = str67 : "+ (str7 == str67));
//↑str6為變數,在執行期才會被解析。
final String str8 = "b";
String str9 = "a" + str8;
String str89 = "ab";
System.out.println("str9 = str89 : "+ (str9 == str89));
//↑str8為常量變數,編譯期會被優化
//↑------------------------------------------------------over
}
---------------------
作者:攻城獅--晴明
來源:CSDN
原文:https://blog.csdn.net/qq_37267015/article/details/59627656?utm_source=copy
版權宣告:本文為博主原創文章,轉載請附上博文連結!