1.代码
package lan.jdk.study;
public class StringTest {
private String name;
private String address;
public static void main(String[] args) {
String s = "";
for(int i = 1; i < 1000000; i++){
s += i;
}
}
@Override
public String toString() {
return "StringTest [name=" + name + ", address=" + address + "]";
}
}
记得刚学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: return
public 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/Objec
t;)Ljava/lang/String;
16: invokespecial #29; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
19: iload_2
20: invokevirtual #32; //Method java/lang/StringBuilder.append:(I)Ljava/la
ng/StringBuilder;
23: invokevirtual #36; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
26: astore_1
27: iinc 2, 1
30: iload_2
31: ldc #40; //int 1000000
33: if_icmplt 8
36: return
public 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/la
ng/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/l
ang/String;
36: areturn
}
可以看jdk会自动优化String相加的代码,因此代码中直接用+操作连接字符串即可,以增加代码可读性。