public static void main(String[] args) throws InterruptedException {
StringBuffer sb = new StringBuffer();
sb.append("a");
}
public static String concatString(String s1, String s2, String s3) {
StringBuffer sb = new StringBuffer();
sb.append(s1);
sb.append(s2);
sb.append(s3);
return s1+s2+s3;
}
反编译后:
public static java.lang.String concatString(java.lang.String, java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=3
0: new #2 // class java/lang/StringBuffer
3: dup
4: invokespecial #3 // Method java/lang/StringBuffer."<init>":()V
7: astore_3
8: aload_3
9: aload_0
10: invokevirtual #5 // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
13: pop
14: aload_3
15: aload_1
16: invokevirtual #5 // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
19: pop
20: aload_3
21: aload_2
22: invokevirtual #5 // Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
25: pop
26: new #6 // class java/lang/StringBuilder
29: dup
30: invokespecial #7 // Method java/lang/StringBuilder."<init>":()V
33: aload_0
34: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
37: aload_1
38: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
41: aload_2
42: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
45: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
48: areturn
LineNumberTable:
line 13: 0
line 14: 8
line 15: 14
line 16: 20
line 17: 26
LocalVariableTable:
Start Length Slot Name Signature
0 49 0 s1 Ljava/lang/String;
0 49 1 s2 Ljava/lang/String;
0 49 2 s3 Ljava/lang/String;
8 41 3 sb Ljava/lang/StringBuffer;
}
SourceFile: "Main.java"
main中的Stringbuffer由于存在引用逃逸,存在线程安全,所以没有优化为Stringbuilder,而第二段Stringbuffer则优化为StringBuilder。