最適化の章

5.3. 文字列の連結

『目的』

文字列の連結方法を改善して実行速度を上げましょう。

『Before』

文字列の連結には”+”演算子を使うことができます。

String str = null;

for (int i = 0; i < max; i++) {
    str += "0123456789012345678901234567890123456789";
}

内部的な動きとして、2つの文字列が結合されるときはその両方の内容がコピーされます。
n個の文字列を結合するのに”+”演算子を繰り返し使うと、nに関して二次の時間を要します。

『After』

StringBuilderによる文字列連結を導入します。

String str = null;
StringBuilder strbuf = new StringBuilder();

for (int i = 0; i < max; i++) {
    strbuf.append("0123456789012345678901234567890123456789");
}
str = strbuf.toString();

初期容量に気を配ることでさらにパフォーマンスを上げられます。
デフォルトの初期容量は一般的には 16 文字分しか取られていません。

容量が足りなくなったらその都度新たな領域を確保して文字列をコピーする動作が行われます。
どの程度の文字列が加わるのか推測がつくのならば初期容量を設定しておきましょう。

StringBuilder str = new StringBuilder(max * 40);

for (int i = 0; i < max; i++) {
    str.append("0123456789012345678901234567890123456789");
}

『まとめ』

あまりパフォーマンスを重視しない場合は”+”演算子でも構いません。
繰り返し結合して文字列を構築する場合はStringBuilderを使いましょう。
初期容量を設定するとさらにパフォーマンスが上がります。

< 前のページへ

Pagetop