2011-09-24 129 views
0

我有一種感覺,使用:StringBuilder.toString()是緩慢的,非常消耗資源的..如何從StringBuilder中快速獲取String?

所以我想是這樣的:

public static void doSomething(String data){ ... } 

public static void main(String[] args) 
{ 
    StringBuilder s = new StringBuilder(); 
    doSomething(""+s); 
} 

但我想知道如果還有其他「更好,更快」的方式,因爲循環中的doSomething(""+s)將會因爲空引號而產生一個新的String實例「」,我認爲,將它放在循環中並不是一個好主意。

+4

爲什麼你認爲StringBuilder.toString()是緩慢和資源消耗? – DHall

+0

我錯了,謝謝 – Reacen

回答

6

doSomething(""+s);得到由JVM

兩次翻譯成下面的代碼

doSomething(new StringBuilder().append("").append(s.toString()).toString());

所以現在,而不是有你有2個1個字符串生成器,並呼籲StringBuilder.toString()。

更好更快的方法是隻使用StringBuilder,而不手動連接字符串。


我只是檢查了Java 1.6.0_26中產生的字節碼編譯器和智能電話的toString()只有一次,但它仍然創造的StringBuilder的兩個實例。這裏的字節代碼

0 new java.lang.StringBuilder [16] 
3 dup 
4 invokespecial java.lang.StringBuilder() [18] 
7 astore_1 [s] 
8 new java.lang.StringBuilder [16] 
11 dup 
12 invokespecial java.lang.StringBuilder() [18] 
15 aload_1 [s] 
16 invokevirtual java.lang.StringBuilder.append(java.lang.Object) : java.lang.StringBuilder [19] 
19 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [23] 
22 invokestatic my.test.Main.doSomething(java.lang.String) : void [27] 
25 return 
+0

謝謝你很多 – Reacen

相關問題