如何从StringBuilder快速获取String?

Rea*_*cen 0 java

我有一种感觉,使用:StringBuilder.toString()是缓慢的,非常耗费资源..

所以我在考虑这样的事情:

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

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

但是我想知道是否还有另一种"更好,更快"的方法,因为doSomething(""+s)在循环中会产生一个新的String实例,因为我认为这是空的引号,并且把它放在里面并不是一个好主意一个循环.

Aug*_*sto 6

doSomething(""+s); 由JVM转换为以下代码

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

所以现在,不是拥有1个字符串构建器,而是拥有2个,并且两次调用StringBuilder.toString().

更好更快的方法是只使用StringBuilder,而无需手动连接字符串.


我刚检查了用java 1.6.0_26生成的字节码,编译器是智能的,只调用了一次toString(),但它仍然创建了2个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 
Run Code Online (Sandbox Code Playgroud)