正確使用String,StringBuffer,StringBuilder
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,如需轉載請自行聯絡原作者
相關文章
- String、StringBuffer、StringBuilder剖析UI
- String、StringBuilder和StringBufferUI
- 【Java】String、StringBuilder和StringBufferJavaUI
- String、StringBuffer、StringBuilder區別?UI
- String、StringBuffer、StringBuilder的理解UI
- String,StringBuffer,StringBuilder區別UI
- java String,StringBuilder和StringBufferJavaUI
- [Java]String、StringBuilder和StringBufferJavaUI
- 老生常談 String、StringBuilder、StringBufferUI
- String、StringBuffer和StringBuilder類的UI
- String,StringBuilder,StringBuffer的區別UI
- String、StringBuilder、StringBuffer的區別UI
- C# string、stringBuffer和stringBuilderC#UI
- Java字串(String_StringBuilder_StringBuffer)Java字串UI
- String、StringBuffer、StringBuilder的區別UI
- String,StringBuffer與StringBuilder的區別UI
- java複習之 String,StringBuffer,StringBuilderJavaUI
- String、StringBuffer、與StringBuilder的區別UI
- String和StringBuilder和StringBuffer三兄弟UI
- String,StringBuffer與StringBuilder的區別??UI
- Android- String、StringBuffer、StringBuilder區別AndroidUI
- Java中String/StringBuffer/StringBuilder區別(轉)JavaUI
- String、StringBuffer與StringBuilder之間區別UI
- Java String StringBuilder 和 StringBuffer 用法詳解JavaUI
- 從為什麼String=String談到StringBuilder和StringBufferUI
- Java中String,StringBuffer,StringBuilder基礎知識JavaUI
- 認識Java中String與StringBuffer以及StringBuilderJavaUI
- 面試必知:String、StringBuilder、StringBuffer的區別面試UI
- Java容器深入淺出之String、StringBuffer、StringBuilderJavaUI
- String, StringBuilder, StringBuffer 之間的區別 - JavaUIJava
- String StringBuffer StringBuilder 三者的區別UI
- 面試常備,字串三劍客 String、StringBuffer、StringBuilder面試字串UI
- 你必須搞清楚的String,StringBuilder,StringBufferUI
- 從原始碼看String,StringBuffer,StringBuilder的區別原始碼UI
- StringBuilder StringBuffer String的區別(原始碼分析)-javaUI原始碼Java
- 第二十節:詳細講解String和StringBuffer和StringBuilder的使用UI
- String StringBuffer StringBuilder的區別(前端面試必備)UI前端面試
- java中String、StringBuilder、StringBuffer三者的區別JavaUI