我知道 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()
}
为什么?
最佳答案
我想说第一个例子肯定更清晰、更容易阅读并且更安全——这几乎总是胜过性能微优化问题。 如果您确实遇到了性能问题,并且您可以证明(通过具体测量)它是由这段代码引起的,并且您还可以通过测量证明,在您的本地环境中,第二个示例明显更快,然后 - 并且只有这样 - 您才有充分的理由使用它。
否则,您的问题没有通用答案。如果人们声称第二个示例平均速度快了 n%,如果它对您的计算机没有任何影响(无论是因为不同的环境,还是因为实际情况),这对您有什么帮助?这段代码在您的应用程序中很少被调用)?
但是,我个人的直觉是,在现代 JVM 上(至少在 JDK6 上,但可能已经在 JDK5 上),第一个示例实际上可能会更快,因为巧妙的 GC 技巧使得分配/释放较短的生活元素极其廉价。特别是如果您使用 StringBuilder
而不是 StringBuffer
,它没有同步开销。
关于java - 重用 StringBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10171223/