前回の投稿の続編です。
前回、Javaで文字列結合をするときはStringBuilderのappendメソッドを使うほうがいいと書きました。
しかし、appendの間違った使い方をしているコードをたまに見かけます。
#appendの間違った使用例
例えばこんなコード
StringBuilder sb = new StringBuilder();
String val = "hoge";
sb.append("[" + val + "]")
+
を使った文字列結合はそのたびにStringオブジェクトを生成するため処理速度が落ちます。
この例だと、"[" + val + "]"
の部分でStringオブジェクトを生成してしまっているため、結局処理速度が落ちてしまいます。
#改善例
こうしましょう
StringBuilder sb = new StringBuilder();
String val = "hoge";
sb.append("[").append(val).append("]");
+
でつなぐのではなく、appendを複数回使ってつなぐのです。
では、改善前と改善後でどのくらい処理速度が変わるのでしょうか?
#処理速度の違いを検証
下記コードで処理速度を比べてみました。
public class StringBuilderTest{
public static void main(String[] args) {
final int MAX_COUNT = 100;
System.out.println("結合回数:" + MAX_COUNT + "回のとき");
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
long resultTime1;
long resultTime2;
long startTime;
long endTime;
/********************* 改善前:append()内で文字列結合を行う場合 *********************/
// 開始時間
startTime = System.nanoTime();
for (int i = 0; i < MAX_COUNT; i++) {
sb2.append(Integer.toString(i) + "\n");
}
// 終了時間
endTime = System.nanoTime();
// 処理にかかった時間を算出
resultTime1 = endTime - startTime;
/********************* 改善後:append()を二回使う場合 *********************/
// 開始時間
startTime = System.nanoTime();
// StringBuilderによる文字列結合
for (int i = 0; i < MAX_COUNT; i++) {
sb1.append(Integer.toString(i)).append("\n");
}
// 終了時間
endTime = System.nanoTime();
// かかった時間
resultTime2 = endTime - startTime;
System.out.println("① append()内で結合を行った時の処理時間:" + resultTime1 + "ナノ秒");
System.out.println("② append()を二回使った時の処理時間:" + resultTime2 + "ナノ秒");
System.out.println("② の方が " + (resultTime1 - resultTime2) + " ナノ秒速い");
}
}
文字列結合を100回行った時の、処理速度の差を比較するプログラムです。
結果は以下。
append
を二回使うほうが速いですね。