Java 何时以及如何有效地使用StringBuilder/Buffer?
我想创建一个字符串,它是通过连接大约3000个其他字符串而形成的。 我听说使用这么多的字符串可能效率很低,因为它们位于某种类型的 在不需要后,GC可能不会立即提取它们 这是最好的办法吗-Java 何时以及如何有效地使用StringBuilder/Buffer?,java,string,stringbuilder,stringbuffer,Java,String,Stringbuilder,Stringbuffer,我想创建一个字符串,它是通过连接大约3000个其他字符串而形成的。 我听说使用这么多的字符串可能效率很低,因为它们位于某种类型的 在不需要后,GC可能不会立即提取它们 这是最好的办法吗- StringBuilder sb = new StringBuilder(""); for(String s : arrayWith3000Strings) { sb.append(s); } 还是应该将所有字符串连接成一个字符串?这绝对是首选StringBuilder的情况 字符串是“不可变的”。任何
StringBuilder sb = new StringBuilder("");
for(String s : arrayWith3000Strings)
{
sb.append(s);
}
还是应该将所有字符串连接成一个字符串?这绝对是首选StringBuilder的情况 字符串是“不可变的”。任何修改字符串(包括“追加”)的操作都会创建一个新字符串。使用stringbuilder可以避免这一开销 此链接(众多链接之一)进一步解释:
是的,你的代码很好
即使使用字符串连接,它也会创建新的
字符串对象
,因为字符串是不可变的。StringBuffer
的性能甚至比StringBuilder
更好,但是StringBuffer
不是线程安全的
编辑:当然,反之亦然:)和
StringBuilder
通常在这两种方法中性能最好……因为它没有同步方法的开销。我认为目前不需要多线程,所以字符串缓冲区可能不是最佳选择。显然,它比弦慢得多builder@Breadbutter在周期密集型应用程序中,它的速度很慢(在那里它被使用了数百万次)。@jsn-是的,我将对它进行3000个计数周期。-是的,因此会有很多字符串。如果我用concat来代替呢?有什么不同吗?concat是对字符串的操作,所有对字符串的操作都会生成新字符串,所以这不是处理这个问题的好方法。您的代码是最佳方式。谢谢……是否还有一种图形方式来显示和比较迭代次数=100000的这些方法?可能您可以获得计时,但坦率地说,我不知道有任何图形工具用于此目的。您可以使用新建StringBuilder()
而不是新建StringBuilder(“”)
如果可以使用StringBuilder,请不要使用StringBuffer。几乎没有好的理由起诉StringBuffer。