[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 13041] Re: 「 Effective Java (第 2 版)」を読む会第 7 回議事録 - 文字列の + 演算



  高橋(智)です。以下の件、実験してみました。

"TAKAHASHI,Toru" wrote:
snip 
> 文字列の+演算は、コンパイラがStringBuilderを使うコードを生成する
>   →昔はStringBufferだった。いつから? どのコンパイルオプションで切り
>   替えられるか?

------------------------------
public class StrPlus {
  public static void main(String[] args) {
    String a = "a";
    String b = "b";
    String c = a + b;
  }
}
------------------------------
というコードをJDK6(Update11)でコンパイルして、javap -c で逆アセンブルしてみました。

まず、デフォルトでは
------------------------------
C:\tmp>javac -source 1.6 -target 1.6 StrPlus.java
C:\tmp>javap -c StrPlus
Compiled from "StrPlus.java"
public class StrPlus extends java.lang.Object{
public StrPlus();
  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 a
   2:   astore_1
   3:   ldc     #3; //String b
   5:   astore_2
   6:   new     #4; //class java/lang/StringBuilder
   9:   dup
   10:  invokespecial   #5; //Method java/lang/StringBuilder."<init>":()V
   13:  aload_1
   14:  invokevirtual   #6; //Method java/lang/StringBuilder.append:
                                     (Ljava/lang/String;)Ljava/lang/StringBuilder;
   17:  aload_2
   18:  invokevirtual   #6; //Method java/lang/StringBuilder.append:
                                     (Ljava/lang/String;)Ljava/lang/StringBuilder;
   21:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   24:  astore_3
   25:  return
}
------------------------------
となり、StringBuilderを利用しています。

次に、JDK1.4レベルに落として試しました。
するとたしかに、StringBuilderの利用からStringBufferに変わってしまいました!!
------------------------------
C:\tmp>javac -source 1.4 -target 1.4 StrPlus.java
C:\tmp>javap -c StrPlus
Compiled from "StrPlus.java"
public class StrPlus extends java.lang.Object{
public StrPlus();
  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 a
   2:   astore_1
   3:   ldc     #3; //String b
   5:   astore_2
   6:   new     #4; //class java/lang/StringBuffer
   9:   dup
   10:  invokespecial   #5; //Method java/lang/StringBuffer."<init>":()V
   13:  aload_1
   14:  invokevirtual   #6; //Method java/lang/StringBuffer.append:
                                     (Ljava/lang/String;)Ljava/lang/StringBuffer;
   17:  aload_2
   18:  invokevirtual   #6; //Method java/lang/StringBuffer.append:
                                     (Ljava/lang/String;)Ljava/lang/StringBuffer;
   21:  invokevirtual   #7; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;
   24:  astore_3
   25:  return
}
------------------------------

-- 
高橋智宏
  Java読書会( http://www.javareading.com/bof/ )