6
3

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.

【String型 vs StringBuilder】文字列結合における処理速度の違い

Last updated at Posted at 2018-07-19

#はじめに
Javaで文字列結合をする際、String型で+=で繋いでいくか、StringBuilderのappend()でつなぐか、2通りの手段があります。

結果はどちらも同じですが、処理速度に差が出ます。

#Stringでやったとき
例えばこんなコード

String stringResult = null;
    // Stringオブジェクトによる文字列結合
    for (int i = 0; i < 10; i++) {
      String str = Integer.toString(i);
      stringResult += str;
    }

String型とはStringオブジェクトのことなので、String型の変数が宣言される=Stringオブジェクトが生まれる、ということになります。

なので、文字列結合をしているstringResult += str;のタイミングでStringオブジェクトを生成しています。

つまり、for文のループの回数分だけStringオブジェクトが生まれるわけです。

#StringBuilderでやったとき
例えばこんなコード

StringBuilder sb = new StringBuilder();
    // StringBuilderによる文字列結合
    for (int j = 0; j < 10; j++) {
      sb.append(Integer.toString(j));
    }

結果はStringの例と同じです。

しかし、append()はStringオブジェクトを作りません。末尾に追加していくだけです。

Stringオブジェクトを生成しない分、処理が速い。

#どれくらい速度が違う?
下記のようなプログラムで、StringとStringBuilderとの処理時間の違いを測ってみました。

public class StringBuilderSample{
  public static void main(String[] args) {
    final int MAX_COUNT = 100;
    System.out.println("結合回数:" + MAX_COUNT + "回のとき");
    /********************* String型の場合 *********************/
    String stringResult = null;

    // Stringでの処理にかかった時間
    long sTime;

    // 開始時間
    long startTime = System.nanoTime();

    // String型による文字列結合
    for (int i = 0; i < MAX_COUNT; i++) {
      String str = Integer.toString(i);
      stringResult += str;
    }

    // 終了時間
    long endTime = System.nanoTime();

    // 処理にかかった時間を算出
    sTime = endTime - startTime;

    System.out.println("Stringでの処理時間:" + sTime + "ナノ秒");

    /********************* StringBuilderの場合 *********************/
    StringBuilder sb = new StringBuilder();

    // StringBuilderでの処理にかかった時間
    long sbTime;

    // 開始時間
    startTime = System.nanoTime();

    // StringBuilderによる文字列結合
    for (int j = 0; j < MAX_COUNT; j++) {
      sb.append(Integer.toString(j));
    }

    // 終了時間
    endTime = System.nanoTime();

    // 処理にかかった時間を算出
    sbTime = endTime - startTime;

    System.out.println("StringBuilderでの処理時間:" + sbTime + "ナノ秒");
    System.out.println("StringBuilderの方が " + (sTime - sbTime) + " ナノ秒速い");
  }
}

文字列結合をMAX_COUNTの回数だけ行ったときの処理速度を表示するプログラムです。

以下、MAX_COUNTの値を100, 1000, 1万, 10万と増やしていきながら処理時間の違いを見ていきます。

ちなみに、ナノ秒とは10 ^ (-9) 秒(=0.000000001秒)のことです。

##100回実行したとき
スクリーンショット 2018-07-19 23.11.48.png

##1000回実行したとき
スクリーンショット 2018-07-19 23.12.23.png

##1万回実行したとき
スクリーンショット 2018-07-19 23.13.53.png
約0.57秒速い

##10万回実行したとき
スクリーンショット 2018-07-19 23.14.49.png

約27秒速い

#StringBuilderのほうが速かった!
1000回ぐらいまでならせいぜいマイクロ秒(10 ^(-6))単位での違いなので、そんなに気にはならない。

1万回超えたあたりから処理時間の差が気になるレベルになってくる。

まあ何回実行するにしてもStringBuilderの方が速いことは確かなので、特別な理由がない限り文字列結合はStringBuilderでやったほうがいいですね。

2018 07/21 追記:続編書きました → 【java】appendの中で"+"は使わない!

6
3
1

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
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?