🐕

StringBuilderのスマートさを思い知った話

2022/02/27に公開

StringBuilder. append() vs. String concatenation operator

Paiza始動した話は、文字列の操作なんですが、StringBuilderのスマートさを実感できた問題だったので、備忘録を残しておきます。参考文献はEffective Java (3 ed.)

想定しているのは、複数の文字列を連結させる時。Stringの連結で行う場合と、StringBuilderappend()メソッドを利用して行う場合が考えられます。

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を避け、StringBuilderappend()を使うか、文字列の配列を使うべし。とのことです。確かに私が書いたでも、かかった時間がぜんぜん違う!

Discussion