只是爲了完整性,我們可以看一下編譯後的字節碼:
int i = 1;
String s1 = "" + i;
String s2 = Integer.toString(i);
使用JDK 1.5.0_16(古我知道,但新的JDK不會是不同的,我認爲),將編譯爲:
0: iconst_1
1: istore_1
2: new #2; //class java/lang/StringBuilder
5: dup
6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
9: ldc #4; //String
11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: iload_1
15: invokevirtual #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
21: astore_2
22: iload_1
23: invokestatic #8; //Method java/lang/Integer.toString:(I)Ljava/lang/String;
26: astore_3
所以,當你使用s1 = "" + i"
,你實際上做的是:
s1 = new StringBuilder().append("").append(i).toString();
(它會創建一個新對象並調用append(String)
,然後調用StringBuilder
的append(int)
方法,然後將其轉換爲字符串。
所以喜歡的Integer.toString(int)
更有效率......
好問題IMO。 – 2012-03-07 15:50:34