Java字符串相加

来源:互联网 发布:虚拟社交网络弊端 编辑:程序博客网 时间:2024/06/15 04:23
Java字符串


一个普通的字符串相加:
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 StringTestPicked 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 StringTestPicked 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 StringTestPicked 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        }


1 0