文字列の連結 | Java StringとStringBuilder

NO IMAGE
         

この記事は1年以上前に更新されたものです。内容が古い可能性がありますのでご注意ください。

文字の連結

JavaでStringを連結する場合の話です。備忘録。

私の素人頭で文字列の連結をすると、単純に+でつなぎます。

String h = "Hello";
String w = "World";

System.out.println(h + w);

という感じです。

一般的にはこれで問題ありません。
速度も気にならないと思いますが、これが5万回とかになると話は別です。

+で連結する際、かなりリソースを消費します。

例えば、Aという文字を5万回追加します。

public class String_1 {

	public static void main(String[] args) {
		long start = System.currentTimeMillis();

		String s = "";
		for(int i = 0; i < 50000; i++) {
			s = s + 'A';
		}

		long time = System.currentTimeMillis() - start;
		System.out.println("処理にかかった時間:" + time + "ms");
		System.out.println("文字列の長さ:" + s.length());
	}
}

私の環境では、

処理にかかった時間:1108ms
文字列の長さ:50000

でした。

次にStringBuilder

+連結ではなく、StringBuilderのインスタンス作成し、StringBuilder#append()を使います。

public class String_2 {

	public static void main(String[] args) {
		long start = System.currentTimeMillis();

		StringBuilder s = new StringBuilder();
		for(int i = 0; i < 50000; i++) {
			s.append("A");
		}

		long time = System.currentTimeMillis() - start;
		System.out.println("処理にかかった時間:" + time + "ms");
		System.out.println("文字列の長さ:" + s.length());
	}
}

結果は

処理にかかった時間:12ms
文字列の長さ:50000

比べるまでもないこの速さ!

ちなみに20万回

  • String+連結
    19145ms
  • StringBuilder
    16ms

勝負になってません。

単純な繰り返しなのに速度が著しくない場合、文字列を疑ってみてはいかがでしょうか。

Stringを+で連結した場合、インスタンスを作成しなおしているため時間がかかる(らしい)
for文やwhile文で連結を多用するならStringBuilder。
普段はStringで扱っていたほうが何かと便利かと。