🐕
StringBuilderのスマートさを思い知った話
StringBuilder. append() vs. String concatenation operator
Paiza始動した話の例は、文字列の操作なんですが、StringBuilderのスマートさを実感できた問題だったので、備忘録を残しておきます。参考文献はEffective Java (3 ed.)
想定しているのは、複数の文字列を連結させる時。String
の連結で行う場合と、StringBuilder
のappend()
メソッドを利用して行う場合が考えられます。
Stringで行う場合
public String statement()
String result = "";
for (int i = 0; i < numItems(); i++)
result += lineForItem(i); // String concatenation
return result;
}
STRINGBUILDERで行う場合
public String statement(){
StringBuilder b = new StringBuilder(numItems() * LINE_WIDTH);
for(int i = 0; i < numItems(); i++)
b.append(lineForItem(i));
return b.toString();
}
String
は、そもそも文字列の連結には向いていない。なぜなら、String
はimmutableなので、連結する際に、連結元の文字列と新たに連結させるの両方の文字列をコピーして、それをくっつけてという過程を経るため。したがって、n個の文字列を連結させようとすると、nの二乗の時間がかかることになる。
Using the string concatenation operator repeatedly to concatenate n strings requires time quadratic in n.
Bloch, J. "Item 63: Beware the performance of string concatenation", Effective Java, p.279
一方StringBuilder
は、それ自体に連結できる。そのため、連結する文字列の個数(上で言っているnが多ければ多いほど)String
に比べて大幅な時間短縮が望める。
Effective Javaでは、2-3個以上の文字列の連結の場合は、String
を避け、StringBuilder
のappend()
を使うか、文字列の配列を使うべし。とのことです。確かに私が書いた例でも、かかった時間がぜんぜん違う!
Discussion