Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何快速从StringBuilder获取字符串?_Java - Fatal编程技术网

Java 如何快速从StringBuilder获取字符串?

Java 如何快速从StringBuilder获取字符串?,java,Java,我觉得使用:StringBuilder.toString()速度慢,而且非常消耗资源 所以我在想这样的事情: public static void doSomething(String data){ ... } public static void main(String[] args) { StringBuilder s = new StringBuilder(); doSomething(""+s); } 但我想知道是否还有其他“更好更快”的方法,因为循环中的doSome

我觉得使用:StringBuilder.toString()速度慢,而且非常消耗资源

所以我在想这样的事情:

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

public static void main(String[] args)
{
    StringBuilder s = new StringBuilder();
    doSomething(""+s);
}
但我想知道是否还有其他“更好更快”的方法,因为循环中的
doSomething(“+s)
将生成一个新的字符串实例,因为空引号“,”我认为,把它放在循环中不是一个好主意。

doSomething(“+s”)被JVM转换为以下代码

doSomething(新的StringBuilder().append(“”).append(s.toString()).toString())

所以现在,您没有使用1个字符串生成器,而是使用了2个,并调用了StringBuilder.toString()两次

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


我刚刚检查了java 1.6.026生成的字节码,编译器是智能的,只调用了一次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 

为什么您认为StringBuilder.toString()速度慢且占用资源?