什么时候应该使用StringBuilder或StringBuffer?


13

在生产型Web应用程序中,我的同伴程序员在各处都使用StringBuffer。现在,我负责应用程序的开发和更正。阅读StringBuilderStringBuffer之后,我决定将所有StringBuffer代码替换为StringBuilder,因为我们不需要数据bean中的线程安全。

例如:(在每个数据bean中,我都可以看到StringBuffer的使用)

@Override
public String toString() {
    StringBuffer sb = new StringBuffer();// replace it from StringBuilder
    sb.append(" ABCD : ").append(abcd);
    sb.append(", EFGH : ").append(efgh);
    sb.append(", IJKL : ").append(ijkl);
}

我们为每个会话/请求创建一个单独的数据bean。会话由单个用户使用,其他用户无法访问它。

在迁移之前,我还应该考虑其他几点吗?

如果只有一个线程(没有等待线程/没有新线程将寻找对象锁定),则它与StringBuffer或StringBuilder的性能相同。我知道在使用StringBuffer的情况下,需要花费时间来获取对象锁,但是我想知道除了保持/释放对象锁外,它们之间是否存在任何性能差异。


9
如果sb像示例中那样将其用作局部变量,则线程安全根本不重要。即使一千个线程同时进入该方法,每个线程也将具有自己的调用堆栈以及自己的局部变量。StringBuilders永远不会互相干扰。
fredoverflow

我一直想知道谁想要像a的接口那样同步两个线程StringBuffer。我从未见过这样的代码,但是从多线程的角度来看,我几乎可以肯定这是一个糟糕的设计。由于我认为沿StringBuffer接口同步线程是一个不好的主意,我认为此类不应该存在,应该一直使用StringBuilder。正如其他人已经提到的那样,StringBuffer由于历史原因存在。
pasztorpisti

Answers:


22

两者之间的唯一区别是StringBuffer中使用的同步。在事物的宏伟方案中,同步的开销并不大,但是相对于没有它们的StringBuilder方法而言,它的开销却很大。JVM正在执行原本不需要做的工作-尤其是只有一个线程等。

如果您的代码有效并且人们没有抱怨性能,那么我就不用担心。您不会为此付出很多。但是,如果您正在编写新代码,或者正在更新使用StringBuffer的代码,则建议同时转换它们为StringBuilder。


我还要补充一点,您需要牢记两者的继承线程安全性。StringBuilder不是线程安全的。
马丁·维尔堡

2
@MartijnVerburg是的,虽然如此,但在stackoverflow.com/questions/6775016/stringbuffer-is-obsolete/中指出的情况很少,要求用多个线程使用String生成器的相同实例的用例很少。
马修·弗林

4
@MartijnVerburg:还应该指出:如果确实需要线程安全,那么机会StringBuffer也不足够!它保证了它不会刹车,但是如果有多个线程一次访问它,那么附加位置就很难控制,因此需要另一个外部同步。
约阿希姆·绍尔

8

在某个时候(Java 1.5)添加了StringBuilder,它是一个更好,更快的StringBuffer,编译器在后台使用它来实现+String上的运算符。

这意味着,通过使用StringBuilder,您不能使代码在引入该类时的JVM上运行。对我们来说这将是一个问题。如果您始终运行最新版本,则无需在意。

尽管由于以下原因,我不会经历您所经历的优化过程。

  • 外部紧密循环的优势可忽略不计。除非它在探查器中明确显示为热点,否则我不会打扰。
  • 更改代码可能会导致错误,因此您必须彻底重新测试应用程序。这可能比在非同步设置中使用同步类要贵得多。

我同意您的意见..仍然无法理解您的观点Outside tight loops the advantage is negligible...
Satish Pandey 2012年

与StringBuffer相对,StringBuilder中缺少的机制是线程安全性的交易速度。这个速度的改进是非常小的,所以只有在做了重要很多倍-这通常是被做过很多次在一个小环的情况。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.