技術メモ(仮)

IT系の話や研究,他のことなど話して行けたらいいな~って感じです.ただいまJavaを学習中

Javaの文字列結合

Javaで文字列結合する場合,+演算子を用いるやStringBuilderクラスを用いるなどがあります.

この2つは何が違うの?
それは連結する速度が違うのです.
実際に以下のコードで測ってみた.

+演算子の場合
public class StrJoinTest {

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		String str = "test\n";
		for(int i = 0; i < 100000; i++) {
			str += "test\n";  // 文字列結合
		}
		long stop = System.currentTimeMillis();
		System.out.println(stop - start);
	}

}

処理時間

14878
StringBuilderクラスの場合
public class StrBuildJoinTest {

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		StringBuilder strbr = new StringBuilder("test\n");
		for(int i = 0; i < 1000000; i++) {
			strbr.append("test\n");  // 文字列結合
		}
		long stop = System.currentTimeMillis();
		System.out.println(stop - start);
		
	}

}

処理時間

20

え?こんなに違うのか!?ソースの記述間違えた!?
なぜ違うのか?それはStringクラスが一度インスタンス化し初期化された値を変えることができない部分にあるらしい.
str += "test\n"って値を変えてるではないかと感じるがこれはstrという新しいインスタンスを作り古いstrというインスタンスは破棄される.すなわち毎回newしてインスタンスを作っているからである.
逆にStringBuilderはappendメソッドを呼び出しバッファに文字列を追加していきバッファを大きくしている.だから高速らしい.

まとめ

文字列結合する場合はStringBuilderクラスを用いるのがいいらしい.
※マルチスレッドの場合は注意が必要らしい.

以上