如何从StringBuilder快速获取String?

时间:2011-09-24 20:42:54

标签: java

我觉得使用:StringBuilder.toString()很慢且非常耗费资源。

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

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

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

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

1 个答案:

答案 0 :(得分: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