关于String连接(+运算符)
1.代码
?记得刚学java的时候,如上代码中的s+=i;应该用StringBuilder的append方法来完成,从而避免生成很多String对象,
而在jdk1.6中,s+=i;这种代码会自动被编译器优化,通过反编译代码,可的到如下结果
Compiled from "StringTest.java"public class lan.jdk.study.StringTest extends java.lang.Object{public lan.jdk.study.StringTest(); Code: 0: aload_0 1: invokespecial #11; //Method java/lang/Object."<init>":()V 4: returnpublic static void main(java.lang.String[]); Code: 0: ldc #19; //String 2: astore_1 3: iconst_1 4: istore_2 5: goto 30 8: new #21; //class java/lang/StringBuilder 11: dup 12: aload_1 13: invokestatic #23; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; 16: invokespecial #29; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 19: iload_2 20: invokevirtual #32; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 23: invokevirtual #36; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 26: astore_1 27: iinc 2, 1 30: iload_2 31: ldc #40; //int 1000000 33: if_icmplt 8 36: returnpublic java.lang.String toString(); Code: 0: new #21; //class java/lang/StringBuilder 3: dup 4: ldc #47; //String StringTest [name= 6: invokespecial #29; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 9: aload_0 10: getfield #49; //Field name:Ljava/lang/String; 13: invokevirtual #51; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 16: ldc #54; //String , address= 18: invokevirtual #51; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 21: aload_0 22: getfield #56; //Field address:Ljava/lang/String; 25: invokevirtual #51; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 28: ldc #58; //String ] 30: invokevirtual #51; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 33: invokevirtual #36; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 36: areturn}?可以看jdk会自动优化String相加的代码,因此代码中直接用+操作连接字符串即可,以增加代码可读性。