java - 重用 StringBuffer

标签 java performance java-6 java-5 stringbuffer

我知道 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 上,但可能已经在 J​​DK5 上),第一个示例实际上可能会更快,因为巧妙的 GC 技巧使得分配/释放较短的生活元素极其廉价。特别是如果您使用 StringBuilder 而不是 StringBuffer,它没有同步开销。

关于java - 重用 StringBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10171223/

相关文章:

java - 在 Adapter Android 的 getView 中搜索对象列表的有效方法

javascript - 在 NodeJS 中创建对象的推荐方法是什么?

java - jdk1.6内存布局

java - 将 JSONObject 存储到变量中并将它们发送到另一个函数

Java:在发送之前显示 HttpURLConnection 的请求

database - 为什么一张大 table 比新的小 table 快?

字符串比较 - JDK 版本产生不同的结果

java - 使用 Cp500(LF 和 NEL)编码陌生度

java - 无法使用 robolectric 捕获 HTTP 请求

java - 我的服务选项卡从 NetBeans 中消失了