我知道concat、StringBuffer和StringBuilder之间的区别。我知道StringBuffer.toString后备数组的内存问题,它会导致内存爆炸。我甚至知道JDK Sun优化包括为初始容量分配2的幂。
但是我仍然想知道重用StringBuffer (在toString()中使用)的最好方法,或者重用StringBuffer是否合适。考虑到内存和速度性能,哪一个更好?
public String toString2() {
StringBuffer sb = new StringBuffer(<size>)
... several .append(stuff) ...
sb.trimToSize()
return sb.toString()
}或
private StringBuffer sb = new StringBuffer(<size>)
public String toString2() {
sb.delete()
sb.setLength(1024)
sb.trimToSize()
... several .append(stuff) ...
return sb.toString()
}为什么呢?
发布于 2012-04-16 17:09:38
StringBuilder,这是StringBuffer的一个非同步变体--这可以直接提高性能。trimToSize --您只是强制StringBuilder生成一个新的字符数组。StringBuilder针对短期对象的分配进行了高度优化,因此通过重用JVM节省的资源非常少。StringBuilder>d13>表达式,而不是简单的串联表达式--例如,您正在迭代某些内容。连接使用StringBuilder.编译成基本上相同的代码。
发布于 2012-04-16 17:02:07
我想说第一个例子肯定更清晰,更容易阅读,也更安全--这几乎总是胜过性能微优化问题。如果你确实有性能问题,和,你可以证明(用具体的测量)这段代码,和你也可以通过测量证明,在你的本地环境中,第二个例子的速度要快得多,然后-只有比-你有一个有效的理由使用它。
否则,你的问题就没有一般的答案了。如果人们声称第二个例子平均快了n%,如果它对你的机器没有任何影响(无论是因为不同的环境,还是因为实际的代码在你的应用程序中很少被调用),这对你有什么帮助?
然而,我个人的直觉是,在现代的JVM虚拟机上(至少在JDK6上,但可能已经在JDK5上),第一个示例实际上可能会更快,因为聪明的GC技巧使得分配/释放短期对象的成本非常低。尤其是如果您使用StringBuilder而不是StringBuffer,它没有同步开销。
发布于 2012-04-16 17:04:05
我根本不会使用StringBuffer,特别是如果性能是个问题的话。
如果您不能确定只有一个线程会调用toString(),我会每次都创建一个StringBuilder。
你有的另一个问题是,不同的数据类型可能会产生大量的垃圾,例如int或double,这会减少你可能获得的任何好处。
我不会回收StringBuilder,我只会让事情变得简单。如果你真的需要最高的性能,我会使用一个不同的解决方案,比如直接的ByteBuffer和一个库,它不会产生垃圾。
https://stackoverflow.com/questions/10171223
复制相似问题