Java String 和 StringBuffer 的区别

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

String 和 StringBuffer 之间存在许多差异。String 和 StringBuffer 之间的区别列表如下

编号。StringStringBuffer
1)String 类是不可变的。StringBuffer 类是可变的。
2)String 速度慢且内存消耗大,因为每次连接过多字符串时都会创建新实例。StringBuffer 速度快且内存消耗少,当连接字符串时。
3)String 类重写了 Object 类的 equals() 方法。因此,您可以使用 equals() 方法比较两个字符串的内容。StringBuffer 类没有重写 Object 类的 equals() 方法。
4)String 类在执行连接操作时速度较慢。StringBuffer 类在执行连接操作时速度较快。
5)String 类使用 String 常量池。StringBuffer 使用堆内存

String vs StringBuffer

String 和 StringBuffer 的性能测试

ConcatTest.java

输出

Time taken by Concating with String: 578ms
Time taken by Concating with  StringBuffer: 0ms

上面的代码计算了使用 String 类和 StringBuffer 类连接字符串所需的时间。

String 和 StringBuffer 哈希码测试

正如我们在下面的程序中看到的,String 在执行连接时返回新的哈希码,而 StringBuffer 类返回相同的哈希码。

InstanceTest.java

输出

Hashcode test of String:
3254818
229541438
Hashcode test of StringBuffer:
118352462
118352462

Java String 和 StringBuffer 选择题

1. 以下哪个陈述最能描述 Java 中 String 和 StringBuffer 的不可变性?

  1. String 和 StringBuffer 都是不可变的。
  2. String 是可变的,而 StringBuffer 是不可变的。
  3. String 是不可变的,而 StringBuffer 是可变的。
  4. String 和 StringBuffer 都是可变的。
 

答案:C

解释: 在 Java 中,String 对象是不可变的,这意味着一旦创建,它们的值就不能更改。另一方面,StringBuffer 对象是可变的,允许在不创建新对象的情况下修改它们的值。


2. 与 String 相比,使用 StringBuffer 在以下哪个操作上效率更高?

  1. 检索特定索引处的字符。
  2. 连接多个字符串。
  3. 将字符串转换为大写。
  4. 比较两个字符串是否相等。
 

答案:B

解释: StringBuffer 在字符串连接方面效率更高,因为它具有可变性,并且不会为每个连接操作创建新对象。相比之下,String 连接会创建新的 String 对象,这可能效率较低。


3. 在 Java 中,何时更倾向于使用 String 而不是 StringBuffer?

  1. 当需要频繁修改字符串时。
  2. 当不关心线程安全时。
  3. 当字符串值预计不会改变时。
  4. 当您需要同步字符串操作时。
 

答案:C

解释:当字符串值预计不会改变时,String 是首选,因为它具有不可变性,这可以带来更少的内存使用和缓存带来的性能优势。当需要频繁修改时,应使用 StringBuffer。


4. StringBuffer 具有而 String 没有的特定方法是哪个?

  1. length()
  2. substring(int start, int end)
  3. append(String str)
  4. charAt(int index)
 

答案:C

解释: append(String str) 方法是 StringBuffer(以及 StringBuilder)特有的,用于将指定的字符串追加到当前序列。String 类没有此方法,因为它不可变。


5. 考虑到线程安全,在多线程环境中,您会使用哪个类来进行可变字符串操作?

  1. String
  2. StringBuffer
  3. StringBuilder
  4. 以上都不是
 

答案:B

解释:StringBuffer 是线程安全的,因为它的方法是同步的,因此适合在多线程环境中使用。StringBuilder 虽然也是可变的,但不是线程安全的,仅应在单线程环境中使用。String 是不可变的,并且本质上是线程安全的,但不适合可变字符串操作。