Skip to content

StringBuffer和StringBuilder是什么,区别是什么

答案

是什么

  • StringBuffer:Java 中的 线程安全的可变字符串类,位于 java.lang 包,用于动态构建和修改字符串,适合多线程环境。
  • StringBuilder:Java 中的 非线程安全的可变字符串类,同样位于 java.lang 包(JDK 5 引入),用于单线程环境下的字符串操作,性能更高。

区别

两者功能相同(都支持 append、insert 等操作),主要区别在于 线程安全性和性能

  • StringBuffer:线程安全,方法加 synchronized,性能稍低。
  • StringBuilder:非线程安全,无同步开销,性能更高。

关键事实详解

1. StringBuffer

  • 定义:可变字符串,内部用字符数组(char[])存储。
  • 线程安全:方法使用 synchronized 同步。
  • 引入:JDK 1.0。

2. StringBuilder

  • 定义:与 StringBuffer 功能相同,但无同步。
  • 线程安全:无保护,多线程可能数据混乱。
  • 引入:JDK 5.0。

具体区别

1. 线程安全性

  • StringBuffer

    • 方法加锁
    • 多线程安全,但锁开销大。
    • StringBuilder

    • 无同步

    • 多线程可能覆盖或错乱。

2. 性能

  • StringBuffer:同步导致性能较低。
  • StringBuilder:无锁,执行更快。
  • 测试
    • 循环拼接 10 万次,StringBuilder 比 StringBuffer 快约 20%-50%。

3. 使用场景

  • StringBuffer:多线程环境,如日志拼接。
  • StringBuilder:单线程环境,如字符串构建。

4. 底层实现

  • 相同点
    • 都基于动态字符数组(char[])。
    • 初始容量 16,扩容规则:新容量 = 旧容量 * 2 + 2。
  • 不同点:仅同步机制差异。

延伸与面试角度

  • 与 String 对比
    • String:不可变,拼接慢(创建新对象)。
    • StringBuffer/StringBuilder:可变,高效。
  • 为什么引入 StringBuilder?
    • StringBuffer 线程安全开销大,单线程场景浪费性能。
    • JDK 5 优化,新增 StringBuilder。
  • 性能数据
    • 单线程拼接 10 万次:StringBuilder ~100ms,StringBuffer ~150ms。
  • 实际应用
    • StringBuffer:多线程日志。
    • StringBuilder:JSON 构建。
  • 面试点
    • 问“线程安全原理”时,提 synchronized。
    • 问“选择依据”时,提线程环境。

总结

StringBuffer 和 StringBuilder 都是可变字符串类,区别在于线程安全(StringBuffer 有,StringBuilder 无)和性能(StringBuilder 更快)。多线程用 StringBuffer,单线程用 StringBuilder。面试时,可写示例或对比性能,展示理解深度。