在哪里使用StringBuffer / StringBuilder而不是String

时间:2012-06-30 11:46:50

标签: java android string stringbuilder

  

可能重复:
  String, StringBuffer, and StringBuilder

我们知道StringStringBuffer / StringBuilder可变的情况下是不可变的。但有时我们会混淆在代码中使用的内容.. String StringBuffer / StringBuilder ??实际上,在我们的最大代码/快速代码中,我们使用String而不是StringBuffer / StringBuilder

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

3 个答案:

答案 0 :(得分:28)

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

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

字符串 StringBuffer StringBuilder

中进行选择的标准
  • 如果Object值不会改变,请使用String Class,因为a String对象是不可变的。
  • 如果Object值可以更改,则只能从a访问 单线程,使用StringBuilder,因为StringBuilder是 不同步。
  • 如果Object值可以更改,并且将被多个修改 线程,使用StringBuffer,因为StringBuffer已同步。

答案 1 :(得分: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);更好。 AFAIK,编译器将使用循环中的字符串连接优化到StringBuilder,但最好手动使用它。

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

答案 2 :(得分:2)

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

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