Java面试题更新 2026-08-05

在 Java 里,String、StringBuffer 与 StringBuilder 三者在可变性、线程安全性以及性能表现上有哪些关键差异?请结合适用场景说明。

技术原理方案权衡Java

考察说明

考查对 Java 字符串类核心特性(不可变性、线程安全、性能)的掌握程度。

回答思路

  1. 【回答框架 1】String 是不可变类,底层 char[] 被 final 修饰,所有修改操作都会生成新对象,因此线程安全且适合常量场景。
  2. 【回答框架 2】StringBuffer 和 StringBuilder 都继承 AbstractStringBuilder,内部使用可变的 char[],append 等操作在原数组上扩容修改,避免频繁创建新对象。
  3. 【回答框架 3】StringBuffer 的方法用 synchronized 修饰,保证线程安全,但同步带来额外开销;StringBuilder 不加锁,单线程下性能更高,是 JDK 1.5 引入的。
  4. 【回答框架 4】选择依据:字符串常量或少量拼接用 String,多线程环境操作字符串缓冲区用 StringBuffer,单线程大量拼接用 StringBuilder。
  5. 【关键点 1】String 不可变,每次修改产生新对象,天然线程安全。
  6. 【关键点 2】StringBuffer 和 StringBuilder 可变,底层 char[] 支持扩容。
  7. 【关键点 3】StringBuffer 方法同步,线程安全但性能略低。
  8. 【关键点 4】StringBuilder 不同步,单线程性能最优。
  9. 【易错点 1】不要误以为 String 的拼接操作总是低效,编译器对字符串常量拼接有优化,但运行时循环拼接仍会生成大量中间对象。
  10. 【易错点 2】线程安全不仅是方法同步,还需考虑复合操作的一致性,StringBuffer 的同步不能保证多步组合操作的原子性。
  11. 【易错点 3】扩容机制依赖版本实现,不应在代码里依赖具体扩容倍数。