Java字符串
一个普通的字符串相加:
javap看一下编译后的结果,可以看到+被转成了StringBuilder的append
一个普通的final字符串相加:
可以看到3个final字符串直接被编译到了变量中
另一个普通的字符串相加:
可以看到构造出了一堆的StringBuilder(goto语句)
一个普通的字符串相加:
public class StringTest {
public static void main(String[] args){
String a = "a";
String b = "b";
String c = "c";
String d = a + b + c;
System.out.println(d);
}
}
javap看一下编译后的结果,可以看到+被转成了StringBuilder的append
zeal@zeal-ThinkPad:~/tobenew$ javap -c StringTest
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
Compiled from "StringTest.java"
public class StringTest {
public StringTest();
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: ldc #4 // String c
8: astore_3
9: new #5 // class java/lang/StringBuilder
12: dup
13: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
16: aload_1
17: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: aload_2
21: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
24: aload_3
25: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
28: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
31: astore 4
33: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
36: aload 4
38: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
41: return
}
一个普通的final字符串相加:
public class StringTest {
public static void main(String[] args){
final String a = "a";
final String b = "b";
final String c = "c";
String d = a + b + c;
System.out.println(d);
}
}
可以看到3个final字符串直接被编译到了变量中
zeal@zeal-ThinkPad:~/tobenew$ javap -c StringTest
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
Compiled from "StringTest.java"
public class StringTest {
public StringTest();
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 abc
2: astore 4
4: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
7: aload 4
9: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
12: return
}
另一个普通的字符串相加:
public class StringTest {
public static void main(String[] args){
final String a = "a";
String b = "b";
for(int i=0; i<5; i++) {
b = b + a;
}
System.out.println(b);
}
}
可以看到构造出了一堆的StringBuilder(goto语句)
zeal@zeal-ThinkPad:~/tobenew$ javap -c StringTest
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
Compiled from "StringTest.java"
public class StringTest {
public StringTest();
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 b
2: astore_2
3: iconst_0
4: istore_3
5: iload_3
6: iconst_5
7: if_icmpge 36
10: new #3 // class java/lang/StringBuilder
13: dup
14: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
17: aload_2
18: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: ldc #6 // String a
23: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
29: astore_2
30: iinc 3, 1
33: goto 5
36: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
39: aload_2
40: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
43: return
}