2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【java】appendの中で"+"は使わない!

Last updated at Posted at 2018-07-21

前回の投稿の続編です。

前回、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回行った時の、処理速度の差を比較するプログラムです。

結果は以下。

スクリーンショット 2018-07-21 19.11.21.png

appendを二回使うほうが速いですね。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?