在哪些情况下应该使用StringBuffer/StringBuilder而不是String?

17

可能是重复问题:
String、StringBuffer 和 StringBuilder

我们知道 String 是不可变的,而 StringBuffer/StringBuilder 是可变的。但有时候我们会困惑该在代码中使用哪一个.. String 还是 StringBuffer/StringBuilder ?? 实际上在我们的大多数代码/快速代码中,我们更倾向于使用 String 而不是 StringBuffer/StringBuilder

这个问题是为了解决困惑,如果你有任何想法和恰当的理由,请回复。


是的,这个链接很有用。 - Soumyadip Das
3个回答

36

以下是这三种最常用类之间的主要区别。

  • String类对象是不可变的,而StringBuffer和StringBuilder对象是可变的。
  • StringBuffer是同步的,而StringBuilder不是同步的。
  • 连接运算符“+”是使用StringBuffer或StringBuilder内部实现的。

选择使用StringStringBufferStringBuilder的标准

  • 如果对象值不会改变,请使用String类,因为String对象是不可变的。
  • 如果对象值可以改变,并且只会从单个线程访问,请使用StringBuilder,因为StringBuilder是非同步的。
  • 如果对象值可以改变,并且将由多个线程修改,请使用StringBuffer,因为StringBuffer是同步的。

1
你的答案很有用,但我们真的要遵循这个吗?我认为答案是否定的。 - Soumyadip Das

4

主要思想是String是不可变的,所以当你尝试修改它时,会创建一个新的对象。StringBuffer和StringBuilder是可变的,而区别在于第一个是线程安全的。

使用StringBuilder的常见方法是在非线程安全的环境中迭代创建String对象时进行解析。

例如,你有一个数字数组[1, 2, 3]。要创建对象"String1String2String3",可以使用StringBuilder。

StringBuilder builder = new StringBuilder();
foreach(Integer num : array) {
    builder.append("String").append(num);
}
builder.toString();

使用String string = string + ("String" + num);不如使用StringBuilder。据我所知,编译器会将循环中的字符串拼接优化为StringBuilder,但最好手动使用它。

当您有由并发线程修改的共享状态时,请使用StringBuffer。


3

StringBuffer是线程安全的,这意味着它们有同步方法来控制访问,以便只有一个线程可以同时访问StringBuffer对象的同步代码。因此,在多线程环境中使用StringBuffer对象通常是安全的。

StringBuilder的访问不是同步的,因此它不是线程安全的。通过不进行同步,StringBuilder的性能可能比StringBuffer更好。因此,如果您在单线程环境中工作,使用StringBuilder而不是StringBuffer可能会导致性能提高。


4
请注意,两个线程同时使用同一个StringBuffer/StringBuilder非常非常罕见。我从未遇到过这种情况。 - Joop Eggen
正确的 :) 我同意并感谢您指出 :) - verisimilitude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接