首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重用StringBuffer

重用StringBuffer
EN

Stack Overflow用户
提问于 2012-04-16 16:59:04
回答 4查看 3.4K关注 0票数 2

我知道concat、StringBuffer和StringBuilder之间的区别。我知道StringBuffer.toString后备数组的内存问题,它会导致内存爆炸。我甚至知道JDK Sun优化包括为初始容量分配2的幂。

但是我仍然想知道重用StringBuffer (在toString()中使用)的最好方法,或者重用StringBuffer是否合适。考虑到内存和速度性能,哪一个更好?

代码语言:javascript
复制
public String toString2() {
  StringBuffer sb = new StringBuffer(<size>) 
  ... several .append(stuff) ...
  sb.trimToSize()
  return sb.toString()
}

代码语言:javascript
复制
private StringBuffer sb = new StringBuffer(<size>) 
public String toString2() {
  sb.delete()
  sb.setLength(1024)
  sb.trimToSize() 
  ... several .append(stuff) ...
  return sb.toString()
}

为什么呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-16 17:09:38

  1. 使用StringBuilder,这是StringBuffer的一个非同步变体--这可以直接提高性能。
  2. 不需要调用trimToSize --您只是强制StringBuilder生成一个新的字符数组。
  3. 由于StringBuilder针对短期对象的分配进行了高度优化,因此通过重用JVM节省的资源非常少。
  4. 仅在不能在单个表达式中表示字符串时使用<StringBuilder>d13>表达式,而不是简单的串联表达式--例如,您正在迭代某些内容。连接使用StringBuilder.

编译成基本上相同的代码。

票数 2
EN

Stack Overflow用户

发布于 2012-04-16 17:02:07

我想说第一个例子肯定更清晰,更容易阅读,也更安全--这几乎总是胜过性能微优化问题。如果你确实有性能问题,,你可以证明(用具体的测量)这段代码,你也可以通过测量证明,在你的本地环境中,第二个例子的速度要快得多,然后-只有比-你有一个有效的理由使用它。

否则,你的问题就没有一般的答案了。如果人们声称第二个例子平均快了n%,如果它对你的机器没有任何影响(无论是因为不同的环境,还是因为实际的代码在你的应用程序中很少被调用),这对你有什么帮助?

然而,我个人的直觉是,在现代的JVM虚拟机上(至少在JDK6上,但可能已经在JDK5上),第一个示例实际上可能会更快,因为聪明的GC技巧使得分配/释放短期对象的成本非常低。尤其是如果您使用StringBuilder而不是StringBuffer,它没有同步开销。

票数 3
EN

Stack Overflow用户

发布于 2012-04-16 17:04:05

我根本不会使用StringBuffer,特别是如果性能是个问题的话。

如果您不能确定只有一个线程会调用toString(),我会每次都创建一个StringBuilder。

你有的另一个问题是,不同的数据类型可能会产生大量的垃圾,例如intdouble,这会减少你可能获得的任何好处。

我不会回收StringBuilder,我只会让事情变得简单。如果你真的需要最高的性能,我会使用一个不同的解决方案,比如直接的ByteBuffer和一个库,它不会产生垃圾。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10171223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档