Java字符串相加

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 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        
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值