16

可能重复:
String、StringBuffer 和 StringBuilder

我们知道在/是可变String的地方是不可变的。但有时我们会感到困惑在我们的代码中使用什么...... StringStringBuffer/StringBuilder ?? 实际上,在我们使用的最大代码/快速代码中,我们比/更喜欢。StringBufferStringBuilderStringStringBufferStringBuilder

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

4

3 回答 3

34

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

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

在StringStringBufferStringBuilder中选择的标准

  • 如果 Object 值不会更改,请使用 String Class,因为 String 对象是不可变的。
  • 如果 Object 值可以更改并且只能从单个线程访问,请使用 StringBuilder,因为 StringBuilder 是不同步的。
  • 如果 Object 值可以更改,并且会被多个线程修改,请使用 StringBuffer,因为 StringBuffer 是同步的。
于 2012-06-30T11:48:28.853 回答
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。

于 2012-06-30T11:58:11.180 回答
2

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

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

于 2012-06-30T11:51:14.053 回答