2011-09-24 125 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

相关问题