文字列結合する場合は、StringBuilderを使おうねというお話。
JDK1.5からStringBullderってのが出来たので、そっちを使ったほうが高速みたいです。
使い方はStringBufferと一緒。
Stringの「+演算子」を使った文字列の結合は、実質的にStringBuffer#append()(JDK1.5以降ではStringBuilder)が使われている。
なので、文字列の結合が多いような処理でStringのまま結合すると、毎回StringBuilderが作られてしまう。
さらに、StringBuilderは(StringBufferも)、コンストラクターで容量を指定しない場合、初期容量は16文字分になっている。
appendした際に容量を超えると拡張されて その分効率が落ちてしまうので、容量が多いことが分かっているのであれば、コンストラクターでサイズ(capacity)を指定した方が良い。
以下が計測したソースと結果(マシン数ペックによるけど)
結果
String : 10966806675
StringBuffer : 5258490
StringBuilder : 1007111
StringBuilder2 : 448940
ソース
String str = ""; long strStart = java.lang.System.nanoTime(); for (int i = 0; i < 10000; i++) { str += "Hello world"; } long strEnd = java.lang.System.nanoTime(); System.out.println("String : " + (strEnd - strStart)); StringBuffer buffer = new StringBuffer(); long bufferStart = java.lang.System.nanoTime(); for (int i = 0; i < 10000; i++) { buffer.append("Hello world"); } long bufferEnd = java.lang.System.nanoTime(); System.out.println("StringBuffer : " + (bufferEnd - bufferStart)); StringBuilder builder = new StringBuilder(); long builderStart = java.lang.System.nanoTime(); for (int i = 0; i < 10000; i++) { builder.append("Hello world"); } long builderEnd = java.lang.System.nanoTime(); System.out.println("StringBuilder : " + (builderEnd - builderStart)); StringBuilder builder2 = new StringBuilder(10000*16); long builderStart2 = java.lang.System.nanoTime(); for (int i = 0; i < 10000; i++) { builder2.append("Hello world"); } long builderEnd2 = java.lang.System.nanoTime(); System.out.println("StringBuilder2 : " + (builderEnd2 - builderStart2));
※ ナノ秒まで計測しているけど特に理由はないです
結果は見ての通り。
とりあえず、Stringの「+演算子」を使った文字列の結合やめてStringBuilderを使おうよってことで。
※スレッドの時は注意して。