Java 中 StringBuffer 与 StringBuilder 的区别

2025年3月22日 | 阅读4分钟

Java 提供了三个类来表示字符序列:String、StringBuffer 和 StringBuilder。String 类是不可变类,而 StringBuffer 和 StringBuilder 类是可变的。StringBuffer 和 StringBuilder 之间有许多区别。StringBuilder 类自 JDK 1.5 起引入。

下面列出了 StringBuffer 和 StringBuilder 之间的区别

Difference between StringBuffer and StringBuilder
编号。StringBufferStringBuilder
1)StringBuffer 是同步的,即线程安全。这意味着两个线程不能同时调用 StringBuffer 的方法。StringBuilder 是非同步的,即非线程安全。这意味着两个线程可以同时调用 StringBuilder 的方法。
2)StringBuffer 的效率低于 StringBuilder。StringBuilder 的效率高于 StringBuffer。
3)StringBuffer 是在 Java 1.0 中引入的StringBuilder 是在 Java 1.5 中引入的

StringBuffer 示例

BufferTest.java

 

输出

hellojava

StringBuilder 示例

BuilderTest.java

输出

hellojava

StringBuffer 和 StringBuilder 的性能测试

让我们看看用于检查 StringBuffer 和 StringBuilder 类性能的代码。

ConcatTest.java

输出

Time taken by StringBuffer: 16ms
Time taken by StringBuilder: 0ms

Java StringBuffer vs StringBuilders 选择题

1. 哪个类是同步的,因此线程安全的?

  1. StringBuffer
  2. StringBuilder
  3. 两者都是同步的
  4. 两者都不是同步的
 

答案:A)

解释:StringBuffer 是同步的,使其线程安全,而 StringBuilder 不是同步的,因此不是线程安全的。


2. 在性能至关重要的单线程应用程序中,应该使用哪个类?

  1. StringBuffer
  2. StringBuilder
  3. 两者都可以使用
  4. 两者都不应使用
 

答案:B)

解释:StringBuilder 是非同步的,比 StringBuffer 更快,适用于单线程应用程序。


3. 以下哪个操作会修改 StringBuffer 的底层数组以增加其容量(如果超过当前容量)?

  1. append()
  2. capacity()
  3. trimToSize()
  4. ensureCapacity()
 

答案:D)

解释:ensureCapacity() 方法确保 StringBuffer 的容量至少等于指定的最小值。如果当前容量小于最小值,则会分配具有更大容量的新数组。


4. 在内存效率方面,应使用以下哪个方法来减少 StringBuffer 对象的存储空间?

  1. delete()
  2. trimToSize()
  3. substring()
  4. setLength()
 

答案:B)

解释:trimToSize() 方法用于将 StringBuffer 对象的存储空间减少到当前大小,这可以提高内存效率。


5. 在不需要线程安全的情况下,哪个类是为了提高性能而引入的 JDK 1.5?

  1. StringBuffer
  2. StringBuilder
  3. String
  4. StringTokenizer
 

答案:B)

解释:StringBuilder 是在 JDK 1.5 中引入的,旨在为 StringBuffer 提供更快的替代方案,当线程安全不是问题时。


Java StringBuffer 和 StringBuilder 选择题

1. 哪个类是同步的?

  1. StringBuffer
  2. StringBuilder
  3. 两者
 

答案:A)

解释:StringBuffer 是同步的,使其线程安全,而 StringBuilder 不是同步的。


2. 哪个类在单线程操作中更快?

  1. StringBuffer
  2. StringBuilder
  3. 两者速度相同
  4. 以上都不是
 

答案:B)

解释:StringBuilder 比 StringBuffer 快,因为它不是同步的,减少了单线程操作中的开销。


3. 在 StringBuffer 和 StringBuilder 中,用于追加字符串的方法是哪个?

  1. append()
  2. concat()
  3. add()
  4. merge()
 

答案:A)

解释:StringBuffer 和 StringBuilder 都使用 append() 方法将文本添加到现有序列中。


4. 关于 StringBuffer 和 StringBuilder,以下哪个说法是正确的?

  1. 两者都是不可变的
  2. 两者都是可变的
  3. StringBuffer 是不可变的,StringBuilder 是可变的
  4. StringBuffer 是可变的,StringBuilder 是不可变的
 

答案:B)

解释:StringBuffer 和 StringBuilder 都是可变的,这意味着它们的内容可以在创建后更改。


5. 何时应使用 StringBuffer 而不是 StringBuilder 类?

  1. 当不需要同步时
  2. 当需要同步时
  3. 当需要更快的性能时
  4. 当需要不可变性时
 

答案:B)

解释:当需要线程安全时使用 StringBuffer,因为它是有同步的,而 StringBuilder 没有。