首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java字符串三剑客:String、StringBuilder、StringBuffer

Java字符串三剑客:String、StringBuilder、StringBuffer

作者头像
予枫
发布2026-01-12 14:41:06
发布2026-01-12 14:41:06
900
举报
文章被收录于专栏:Java 筑基与进阶Java 筑基与进阶

这三个类是 Java 中处理字符串的“三剑客”,面试中必考。

简单来说,它们的区别主要体现在 可变性 (Mutability)线程安全 (Thread Safety)性能 (Performance) 上。

1. 一张表看懂区别

特性

String

StringBuilder

StringBuffer

可变性

不可变 (Immutable)

可变 (Mutable)

可变 (Mutable)

线程安全

线程安全 (因为不可变)

非线程安全

线程安全 (Synchronized)

性能

修改时最慢 (要创建新对象)

最快

较快 (有锁的开销)

推荐场景

字符串常量、少量拼接

单线程大量拼接 (最常用)

多线程并发修改字符串

2. 深度解析
A. String (不可变对象)
  • 本质:一旦创建,内容就不能改。
  • 原理:当你写 String s = "Hello"; s = s + " World"; 时,Java 并没有在原字符串上修改,而是:
    • 创建了 "Hello"。
    • 创建了 " World"。
    • 创建了一个新对象 "Hello World"。
    • s 指向这个新对象。
    • 旧的 "Hello" 变成了垃圾(等待回收)。
  • 缺点:如果在循环里疯狂拼接字符串,会产生无数垃圾对象,内存爆炸,速度极慢。
B. StringBuilder (可变,无锁) —— 主力军
  • 本质:一个可变的字符序列,像一个容器。
  • 原理sb.append("a") 是直接在容器内部追加字符,不会创建新对象
  • 特点:因为没有加锁(synchronized),所以速度最快
  • 场景:99% 的字符串拼接场景(只要不是多线程共享同一个 StringBuilder 变量)都应该用它。
C. StringBuffer (可变,有锁) —— 老前辈
  • 本质:跟 StringBuilder API 一模一样,但它是 JDK 1.0 就有的老前辈。
  • 特点:它的方法都加了 synchronized 关键字(线程锁)。这意味着同一时间只能有一个线程操作它。
  • 缺点:为了保证安全,牺牲了性能。
  • 场景:只有在多线程同时修改同一个字符串变量时才用(现在很少见了,因为通常会用其他并发工具)。

3. 代码对比:为什么不能在循环用 String?

❌ 错误写法 (String):

代码语言:javascript
复制
String s = ""; // 这种写法效率极低!每次循环都 new 一个新对象
for (int i = 0; i < 10000; i++) {
    s = s + i;
}

✅ 正确写法 (StringBuilder):

代码语言:javascript
复制
StringBuilder sb = new StringBuilder(); // 这种写法效率极高,只在一个对象上操作
for (int i = 0; i < 10000; i++) {
    sb.append(i);
} 
String res = sb.toString();

4. 总结与记忆口诀
  1. String:死板的常量,改一次就得换个新的。
  2. StringBuilder最常用的工具人,动作快,效率高,平时拼接就用它。
  3. StringBuffer:为了安全(线程安全)变得动作迟缓的老工具人。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 一张表看懂区别
  • 2. 深度解析
    • A. String (不可变对象)
    • B. StringBuilder (可变,无锁) —— 主力军
    • C. StringBuffer (可变,有锁) —— 老前辈
  • 3. 代码对比:为什么不能在循环用 String?
  • 4. 总结与记忆口诀
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档