正確使用String,StringBuffer,StringBuilder

範大腳腳發表於2017-11-15

CharSequence介面有三個實現類與字串有關:String,StringBuffer,StringBuffer.雖然它們都與字串有關,但是其處理機制是不同的.

String類是不可改變的量,也就是建立之後就不能再修改了,比如建立了一個”abc”這樣的字串物件,那麼它在記憶體中永遠都會是”abc”,這樣具有固定表面值的一個物件,不能被修改,即使想通過String提供的方法來嘗試修改,也是要麼建立一個新的字串物件,要麼返回自己,比如:

        String str = "abc";
        String str1 = str.substring(1);

其中,str是一個字串物件,其值是”abc”,通過substring方法又重新生成了一個字串str1,它的值是”bc”,也就是說str引用的物件一旦產生就永遠不會改變.為什麼上面還說有可能不建立物件而返回自己呢?那是 因為採用str.substring(0)就不會建立新物件,JVM會從字串池中返回str的引用,也就是自身的引用. 

StringBuffer上一個可變字元序列,它與String一樣,在記憶體中儲存的都是一個有序的字元序列(char型別的陣列),不同點是StrignBuffer物件的值是可改變的.例如:

1         StringBuffer sb = new StringBuffer("a");
2         sb.append("b");

 

上面的程式碼可以看出sb的值在改變,初始化的時候是”a”,經過append方法後,其值變成了”ab”,這種方式與String類通過”+”連線有什麼區別?例如:

        String s = "a";
        s = s + "b";

 

有區別的,字串變數s初始化的時是”a”物件的引用,經過加號計算之後,s變數就修改為”ab”的引用,但是初始化的”a”物件還是沒有改變,只是s指向了新的引用地址.

StringBuffer的物件,它的引用地址雖不變,但是值在改變.

 

StringBuilder和StringBuffer基本相同,都是可變字元序列,不同點是:StringBuffer是執行緒安全的,StringBuilder是執行緒不安全的,看兩者的原始碼,就會發現在StringBuffer的方法前都有synchronized關鍵字,這也是StringBuffer在效能上遠低於StringBuilder的原因.

在效能方面,由於String類的操作是產生新的String物件,而StringBuilder和StringBuffer只是一個字元陣列的在擴容而已,所以String類的操作要遠慢於StringBuffer和StringBuilder.

弄清楚了三者的原理,我們就可以在不同的場景下使用不同的字元序列了:

(1)使用String類的場景

在字串不經常變化的場景中可以使用String類,例如常量的宣告,少量的變數運算等.

(2)使用StringBuffer類的場景

在頻繁進行字串的運算(如拼接,替換,刪除等),並且執行在多執行緒的環境中,則可以考慮StringBuffer,例如XML解析,HTTP引數解析和封裝等.

(3)使用StringBuilder的類的場景

在頻繁進行字串的運算(如拼接,替換,刪除等),並且執行在單執行緒的環境中,則可以考慮使用StringBuilder,如SQL語句的拼裝,JSON封裝等.

 

本文轉自SummerChill部落格園部落格,原文連結:http://www.cnblogs.com/DreamDrive/p/5660248.html,如需轉載請自行聯絡原作者


相關文章