StringとStringBufferの違い

よく文字列を操作するのは遅いStringBufferを用いるべきだという話をよく耳にする。
そこでStringは一体どれほどStringBufferより遅いのかを調べるために、試しにコードを書いてみることにした。

public class CompareStringBufferAndString {
	
	public static void main(String args[]){
		long start,stop,diff;
		start=System.nanoTime();
		String input=new String("abcd");
		input=input+"efgh";
		stop=System.nanoTime();
		diff=stop-start;
		System.out.println("Stringの実行時間:\t"+diff+"ナノ秒");
		start=System.nanoTime();
		StringBuffer buf=new StringBuffer("abcd");
		buf.append("efgh");
		stop=System.nanoTime();
		diff=stop-start;
		System.out.println("StringBufferの実行時間:\t"+diff+"ナノ秒");
	}

}

実行結果は、
Stringの実行時間:     61977ナノ秒
StringBufferの実行時間: 387538ナノ秒

あれ?Stringのほうが早い?
というわけで

public class CompareStringBufferAndString {
	
	public static void main(String args[]){
		long start,stop,diff;
		String input=new String("abcd");
		start=System.nanoTime();
		input=input+"efgh";
		stop=System.nanoTime();
		diff=stop-start;
		System.out.println("Stringの実行時間:\t"+diff+"ナノ秒");
		StringBuffer buf=new StringBuffer("abcd");
		start=System.nanoTime();
		buf.append("efgh");
		stop=System.nanoTime();
		diff=stop-start;
		System.out.println("StringBufferの実行時間:\t"+diff+"ナノ秒");
	}

}

のように変更してみたすると実行結果が
Stringの実行時間: 47116ナノ秒
StringBufferの実行時間: 5198ナノ秒
となりStringBufferのほうが文字列に付け加えるのは速い。

じゃあなんでさっきの結果が出たのかというと、
コンストラクタがStringに比べて圧倒的に遅かった。
コンストラクタを比べた場合
Stringの実行時間: 15150ナノ秒
StringBuffereの実行時間: 42376ナノ秒
なので2倍以上違う。
文字列を操作する時はStringBufferを使うことを推奨されるが、
限られた用途で限界まで速さを求めるときは色々と注意をしなくてはならないようだ。