String、StringBuffer、StringBuilder的區別

 

提高你的Java代碼質量吧:你能正確使用String、StringBuffer、StringBuilder嗎

標籤: JavaStringStringBufferStringBuilder

 分類:

一、建議 

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。 

三、場景 

如: 

[java] view plain copy
  1. String str = "abc";   
  2. String str1 = str.substring(1);   

str是一個字符串對象,值是"abc",通過substring方法又重新生成了一個字符串str1,其值是"bc",也就是說str引用的對象一旦產生就永遠不會改變。 

如: 

[java] view plain copy
  1. StringBuffer sb = new StringBuffer("a");   
  2. sb.append("b");   

sb的值在改變,初始化時"a",經過append方法後,值變成了"ab"。它與String類通過"+"連接的區別 

如: 

[java] view plain copy
  1. String s = "a";   
  2. s = s + "b";   

字符串變量s初始化時是"a"對象的引用,經過加號計算後,s變量就修改爲"ab"的引用,但是初始化的”a“的對象還是沒有改變,只是變量s指向了新的引用地址。而StringBuffer對象,它的引用地址雖不變,但值在改變。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章