Posted at

StringとStringBuilderの文字列結合時の違い

More than 3 years have passed since last update.

はじめに

javaでコードを書いているみなさん

StringとStringBuilderの違いってなんだよと思ったことはありませんか?

今回はそんな人の疑問に答えます

説明

いきなり説明ですが...

そもそもString型はプリミティブ型ではなくStringオブジェクトというオブジェクトなので

変数のように定義する度に新しく文字列のオブジェクトを生成していきます

これが実は大きな違いで、数個の定義であればString型で定義してしまったほうが早いけど

その数が増え100個などと大きくなると生成するのに想定外なほど時間がかかりプログラムに負荷をかけます。

なので、定義数が多くなるときは、一般にStringBuilderクラスを使用し

定義する方が一度の生成で済むので効率的です。

でも、何個も別の文字列を生成するときならどっちを使っても変わらないんじゃないか?と思う鋭い方もいるかと思います。

StringBuilderが大きな効果を示すのは主に、「文字列の結合時」です。

よく耳にするかたもいるかもしれませんが、

Stringの+,StringBuilderによる文字列結合の違いを説明できればjavaプログラマだと。

String型では結合するために別のString型を定義し、それをもとの文字列に結合するのが一般的です

それをideone.comで実際に以下の条件で結合してみます

・1000個の数字を文字列変換し結合させ、結果を表示する

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
String result = null;

for(int i = 0; i < 1000; i++){
String s = Integer.toString(i);
result += s;
}

System.out.println(result);
}
}

このときの結合では

処理完了までの時間が0.09s

必要なメモリ数が380480とでました

これを同条件でStringBuilderクラスを用いて実装してみると


import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
StringBuilder sb = new StringBuilder();

for(int i = 0; i < 1000; i++){
sb.append(Integer.toString(i));
}

System.out.println(sb);
}
}

このとき結果は

処理完了までの時間が0.07s

必要なメモリ数が 380544とでました

メモリはクラスオブジェクトを使用する関係でやや増えましたが

処理を完了するまでの時間に大きな差が出ました。

これがStringとStringBuilderでの文字列結合の違いです