文字列連結はどんな場合でも StringBuffer を使ったほうが速い…わけではありません
「文字列連結はどんな場合でも StringBuffer(1.5以降で同期が不要なら StringBuilder)を使ったほうが速い」という主張は聞いたことがありませんが、そんな人が居ると困るので書いておきます。
C:\test>more Test.java public class Test { public static void main(String[] args) { String str = "aaa" + "bbb"; System.out.println(str); } } C:\test>javac Test.java C:\test>java Test aaabbb C:\test>javap -c Test Compiled from "Test.java" public class Test extends java.lang.Object{ public Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2; //String aaabbb 2: astore_1 3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream; 6: aload_1 7: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 10: return } C:\test>
「javap -c」の結果を見ればわかるように、コンパイルの時点で、ソース上「+」演算子で連結されている2つの文字列は1つの文字列としてコンパイルされます。
これを StringBuffer に書き換えてみます。
C:\test>more Test2.java public class Test2 { public static void main(String[] args) { StringBuffer sb = new StringBuffer(); sb.append("aaa").append("bbb"); System.out.println(sb.toString()); } } C:\test>javac Test2.java C:\test>java Test2 aaabbb C:\test>javap -c Test2 Compiled from "Test2.java" public class Test2 extends java.lang.Object{ public Test2(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: new #2; //class java/lang/StringBuffer 3: dup 4: invokespecial #3; //Method java/lang/StringBuffer."<init>":()V 7: astore_1 8: aload_1 9: ldc #4; //String aaa 11: invokevirtual #5; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer; 14: ldc #6; //String bbb 16: invokevirtual #5; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer; 19: pop 20: getstatic #7; //Field java/lang/System.out:Ljava/io/PrintStream; 23: aload_1 24: invokevirtual #8; //Method java/lang/StringBuffer.toString:()Ljava/lang/String; 27: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 30: return } C:\test>
むしろ処理が増えます。試すまでもありませんでしたね。