1. 程式人生 > >深入理解String、StringBuffer、StringBuilder區別和底層實現

深入理解String、StringBuffer、StringBuilder區別和底層實現

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 版權宣告:本文為博主原創文章,轉載請附上博文連結!