2013-08-26 1 views
26

純粋なストリング連結よりもストリングビルダーを使用する利点とトレードオフは何ですか?ストリングビルダーとストリングの連結

new StringBuilder(32).append(str1) 
        .append(" test: ") 
        .append(val) 
        .append(" is changed") 
        .toString(); 

str1 + " test: " + val + " is changed". 

str1を言うのランダムな10文字の文字列です。 str2は、ランダムな8文字の文字列です。

+0

ごく簡単な例では、メリットがない場合があります。 StringBuildersは便利です。連結したときに新しい文字列を作成する+と連結するときです。したがって、StringBuilderは、多数の文字列を連結するためにより効率的です。 –

答えて

49

コンパイラがStringBuilderを使用して文字列の連結を行うため、わかりやすい例ではありません。ただし、ループ内で連結が発生した場合、コンパイラは複数のオブジェクトを作成する可能性があります(StringBuilderおよびString)。例えば:上記3行目が実行されるたびに、StringBuilderオブジェクトが作成される

String s= "" ; 
for(int i= 0 ; i < 10 ; i++) 
    s+= "a" ; 

sの内容は添付「」添付し、その後StringBuildersに戻って割り当てられる文字列に変換されます。 。合計1StringBuildersと1Stringsの合計。わずか1 が作成さ

StringBuilder sb= new StringBuilder() ; 
for(int i= 0 ; i < 10 ; i++) 
    sb.append("a"); 
String s= sb.toString() ; 

における逆

、。

この主な理由は、最初のループが2番目のループと同等であり、より効率的な(バイト)コードを生成することをコンパイラーが理解できないほどです。もっと複雑なケースでは、賢明なコンパイラが知ることすらできません。この最適化が絶対に必要な場合は、StringBuilderを明示的に使用して手動で導入する必要があります。

4

迅速な答えはパフォーマンスです: あなたはネイティブのStringクラスを使用しているとき、それはあなたが

String line = "java"; 
    String sufix = " is awesome"; 
    line = line + sufix; 

を書いているとき、それは二つの文字列の「Java」を作成し、「素晴らしいです」になることを意味する、不変の文字列を運営あとでガベージコレクタによって削除される可能性のある2つ目の "java is awesome"( "java"と "awesome")から新しい3番目の文字列 "java is awesome"を作成するよりも、それは遅い解決策です。

より高速なソリューションは、StringBufferクラスのアプライアンスで、スマートなアルゴリズムによって、文字列をマージするためのバッファ(その名前から明白です)を提供し、結果として連結プロセス中の最初の文字列を削除しません。

シングルスレッドアプリケーション(複数のスレッドが同じオブジェクトにアクセスする際の同時性の問題はありません)を作成している場合は、初期のStringBufferクラスよりもさらに高速なStringBuilderを適用する方がよいでしょう。

+0

こんにちは、スレッドセーフなデータ構造と同じように、マルチスレッド実行時にスレッドセーフなバージョンのString Builderを使用することをお勧めしますか? – nmxprime

関連する問題