m2

文字列連結はどんな場合でも 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>

むしろ処理が増えます。試すまでもありませんでしたね。