StringBuffer和StringBuilder之间的主要区别是什么?在决定其中任何一项时是否存在性能问题?


当前回答

String是一个不可变的对象,这意味着值不能更改,而StringBuffer是可变的。

StringBuffer是同步的,因此是线程安全的,而StringBuilder不是,并且只适用于单线程实例。

其他回答

字符串是不可变的。

StringBuffer是一个可变的和同步的。

StringBuilder也是可变的,但不同步。

StringBuffer中的每个方法都是同步的。因此,一次只允许一个线程操作StringBuffer对象。它增加了线程的等待时间并造成性能问题为了解决这个问题,SUN People推出了1.5版本的StringBuilder。

字符串缓冲区是可变的。它可以在长度和内容方面改变。StringBuffers是线程安全的,这意味着它们有同步的方法来控制访问,这样一次只有一个线程可以访问StringBuffer对象的同步代码。因此,StringBuffer对象在多线程环境中使用通常是安全的,因为多个线程可能同时尝试访问同一StringBuffer。

字符串拼接StringBuilder类与StringBuffer非常相似,只是它的访问不同步,因此不是线程安全的。通过不同步,StringBuilder的性能可以优于StringBuffer。因此,如果您在单线程环境中工作,使用StringBuilder而不是StringBuffer可能会提高性能。这也适用于其他情况,例如StringBuilder局部变量(即方法中的变量),其中只有一个线程将访问StringBuilder对象。

StringBuilder不是线程安全的。字符串缓冲区是。更多信息请点击此处。

编辑:至于性能,在热点启动后,StringBuilder是赢家。然而,对于较小的迭代,性能差异可以忽略不计。

StringBuilder是在Java1.5中引入的,因此它不能与早期的JVM一起使用。

从Javadocs:

StringBuilder类提供了与StringBuffer兼容的API,但不能保证同步。该类被设计为在单个线程使用字符串缓冲区的地方(通常情况下)作为StringBuffer的替代品。在可能的情况下,建议优先使用该类而不是StringBuffer,因为在大多数实现中,它会更快。