我觉得使用:StringBuilder.toString()很慢且非常耗费资源。
所以我在考虑这样的事情:
public static void doSomething(String data){ ... }
public static void main(String[] args)
{
StringBuilder s = new StringBuilder();
doSomething(""+s);
}
但我想知道是否还有另一种“更好,更快”的方法,因为循环中的doSomething(""+s)
会产生一个新的String实例,因为我认为这是空的引号,而且它是把它放在循环中不是个好主意。
答案 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