版權聲明:本文爲博主原創文章,未經博主允許不得轉載。
一、建議
CharSequence接口有三個實現類與字符串相關:String、StringBuffer、StringBuilder,雖然它們都與字符串相關,但是其處理機制不同。
根據不同的場景,建議使用不同的字符序列:
1.使用String類的場景:在字符串不經常變化的場景中可以使用String類,例如常量的聲明、少量的變量運算。
2.使用StringBuffer類的場景:在頻繁進行字符串運算(如拼接、替換、刪除等),並且運行在多線程環境中,則可以考慮使用StringBuffer,例如XML解析、HTTP參數解析和封裝。
3.使用StringBuilder類的場景:在頻繁進行字符串運算(如拼接、替換、和刪除等),並且運行在單線程的環境中,則可以考慮使用StringBuilder,如SQL語句的拼裝、JSON封裝等。
二、分析
String類:是不可改變的量,也就是創建後就不能在修改了。
StringBuffer類:是一個可變字符串序列,它與String一樣,在內存中保存的都是一個有序的字符串序列(char類型的數組),不同點是StringBuffer對象的值都是可變的。
StringBuilder類:與StringBuffer類基本相同,都是可變字符換字符串序列,不同點是StringBuffer是線程安全的,StringBuilder是線程不安全的。
在性能方面,由於String類的操作是產生新的String對象,而StringBuilder和StringBuffer只是一個字符數組的擴容而已,所以String類的操作要遠慢於StringBuffer和StringBuilder。
三、場景
如:
- String str = "abc";
- String str1 = str.substring(1);
str是一個字符串對象,值是"abc",通過substring方法又重新生成了一個字符串str1,其值是"bc",也就是說str引用的對象一旦產生就永遠不會改變。
如:
- StringBuffer sb = new StringBuffer("a");
- sb.append("b");
sb的值在改變,初始化時"a",經過append方法後,值變成了"ab"。它與String類通過"+"連接的區別。
如:
- String s = "a";
- s = s + "b";
字符串變量s初始化時是"a"對象的引用,經過加號計算後,s變量就修改爲"ab"的引用,但是初始化的”a“的對象還是沒有改變,只是變量s指向了新的引用地址。而StringBuffer對象,它的引用地址雖不變,但值在改變。