java字符串操作最常用的三个类是string、stringbuilder和stringbuffer:string不可变,适合常量和多线程读取;stringbuilder非线程安全但性能最高,适用于单线程高频拼接;stringbuffer线程安全但有同步开销,适用于多线程修改场景。

Java字符串操作最常用的三个类是 String、StringBuilder 和 StringBuffer。选错类不会报错,但可能带来性能浪费、线程隐患或内存压力。关键不在“会不会用”,而在“为什么这样用”。
String:不可变的字符串常量
String 本质是一个 final 修饰的字符数组(JDK9+ 改为 byte[]),一旦创建,内容无法更改。任何看似“修改”的操作(如 +、substring()、replace())都会生成新对象。
- 天然线程安全——因为不能改,多个线程读同一个 String 没问题
- 适合场景:配置项(
"jdbc:mysql://...")、字面量("SUCCESS")、方法参数传递、Map 的 key - 慎用拼接:循环中写
s += "x",1000 次就产生约 1000 个中间 String 对象 - 注意字符串池:直接赋值(
String s = "abc")优先复用常量池;new String("abc")总是在堆新建
StringBuilder:单线程高频拼接首选
底层是可扩容的 char[] 数组,所有修改都在原数组上进行,不加锁,无同步开销。
- 性能最高——比 StringBuffer 快约 10%–20%,比反复拼接 String 快数十倍
- 适用场景:日志组装、JSON 构建、SQL 拼接、模板渲染等单线程下的动态字符串构造
- 常用方法:
append()、insert()、delete()、reverse()、toString() - 小技巧:初始化时指定容量(如
new StringBuilder(1024)),避免多次扩容拷贝
StringBuffer:多线程环境下的可变字符串
API 与 StringBuilder 几乎完全一致,区别仅在于每个 public 方法都加了 synchronized,保证多线程并发调用的安全性。
- 线程安全但有代价——锁竞争会降低吞吐,不适合高并发拼接场景
- 典型用途:共享的缓存构建器(如 Servlet 容器中跨请求的日志缓冲区)、老项目兼容性要求
- 现代开发中,更推荐用
ThreadLocal<stringbuilder></stringbuilder>替代 StringBuffer,兼顾安全与性能 - 不要为了“看起来更安全”而默认选它——绝大多数业务代码是单线程上下文
StringJoiner:带分隔符拼接的专用工具
不是替代前三者,而是封装了 StringBuilder 的便捷包装类,专用于分隔符场景(如 CSV、JSON 数组、SQL IN 列表)。
- 自动处理首尾分隔符逻辑,避免手动判断是否追加逗号
- 支持前缀(
"[")和后缀("]"),例如:new StringJoiner(",", "[", "]")→[a,b,c] - 内部就是持有一个 StringBuilder,线程不安全,性能等同 StringBuilder
- 当需求明确是“用某符号连接多个字符串”,优先考虑 StringJoiner,语义更清晰
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











