提升你的Java代碼質量吧:讓咱們疑惑的字符串拼接方式的選擇

1、分析 java

對於一個字符串進行拼接有三種方法:加號、concat方法、及StringBuiler或StringBuffer 算法

1."+"方法拼接字符串 編程

str += "c";等效於:str = new StringBuffer(str).append("c").toString(); 數組

雖然編譯器對字符串加號作了優化,它會用StringBuffer的append方法進行追加。再是經過toString方法轉換成String字符串的。 app

它與純粹的append方法是不一樣的 性能

一是每次都要建立一個StringBuilder對象 優化

二是每次執行完畢都要調用toString方法將其轉換爲字符串 ui

2.concat方法拼接 this

concat方法的源碼 spa

 

public string concat(String str){ 
    int otherLen = str.length(); 
 
    //若是追加的字符串長度爲0,則返回字符串自己 
    if(otherLen == 0){ 
        return this; 
    } 
 
    //字符串數組,容納的是新字符串的字符 
    char buf[] = new char[count + otherLen]; 
    //取出原字符串放到buf數組中 
    getChars(0, count, buf, 0); 
    //追加的字符串轉化成字符串數組,添加到buf中 
    str.getChars(0, otherLen, buf, count); 
    //賦值字符數組,產生一個新的字符串 
    return new String(0, count + otherLen, buf); 
} 

 

從總體上看就是一個數組的拷貝,雖然在內存中的處理都是原子性操做,速度很是快,注意看最後的return語句,每次的concat操做都會一個新的String對象,這就是concat速度慢下來的緣由。 

3.appned方法拼接 

StringBuilder的appned方法字節由父類的AbstractStringBuilder實現,代碼以下 

 

public AbstractStringBuilder append(String str){ 
    //若是是null值,則把null做爲字符串處理 
    if(str == null)str = "null"; 
 
    int len = str.length(); 
    //字符串的長度爲0,則返回自身 
    if(len == 0)return this; 
 
    int newCount = count + len; 
    //追加後的字符串組長度是否超過當前值 
    if(newCount > value.length) 
        expandCapacity(newCount);//加長,並做數組拷貝 
    //字符串複製到目標數組 
    str.getChars(0, len, value, count); 
    count = newCount; 
 
    return this; 
} 

 

整個append方法都在作字符數組處理,加長,而後數組拷貝,這些都是基本的數據處理,沒有新建任何對象,因此速度也就最快了 

2、場景 

看看以下代碼 

 

public static void doWithStringBuffer(){ 
    StringBuilder db = new StringBuilder("a"); 
    for(int I = 0; I < 50000; I ++){ 
        sb.append("c"); 
        //str += "c"; 
        //str = str.concat("c"); 
    } 
    String str = sb.toString(); 
} 

 

1.StringBuffer的append方法執行時間是0毫秒,時間很是短暫; 

2.contact方法次之,由上分析,每次的concat操做都須要建立一個String對象,它建立了5萬個String對象; 

3.加法拼接,每次建立一個StringBuilder對象,並執行完畢調用toString()方法轉換。它建立了5萬個StringBuilder對象,toString轉換5萬次。 

3、建議 

三者的實現方法不一樣,性能也就不一樣,可是並不表示必定要使用StringBuilder,這是由於「+」很是符合咱們的編程習慣,適合人類閱讀,大多數狀況下,咱們使用加號操做。 

只有在系統系能臨界(如在性能「增加一分則太長」的狀況下)的時候,才考慮使用concat或append方法。並且不少時候系統80%的性能是消耗在20%的代碼上的,咱們的精力應該更多的投入到算法和結構上。

相關文章
相關標籤/搜索