[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/ )