前回の記事で、Javaで文字列結合をするときはStringBuilderのappendメソッドを使うほうがいいと書きました。
programmers-outputs.hatenablog.com
しかし、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
を二回使うほうが速いですね。