news 2026/4/18 8:40:29

吃透 String、StringBuffer 和 StringBuilder 的区别,面试笔试不再踩坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
吃透 String、StringBuffer 和 StringBuilder 的区别,面试笔试不再踩坑

文章目录

  • 前言
  • 一、核心区别:不可变 vs 可变
    • 1. String:不可变的字符序列
    • 2. StringBuffer & StringBuilder:可变的字符序列
  • 二、线程安全:线程安全 vs 非线程安全
    • 1. StringBuffer:线程安全的选择
    • 2. StringBuilder:单线程高性能之选
  • 三、性能对比:谁才是效率之王
  • 四、使用场景总结:什么时候用谁?
  • 五、面试高频问题
    • 为什么 String 是不可变的?
    • StringBuffer 和 StringBuilder 的区别?
    • 为什么不推荐用 StringBuffer?
  • 总结

前言

大家好,我是程序员梁白开,今天我们聊一聊 String、StringBuffer 和 StringBuilder 的区别。

在 Java 开发中,字符串是我们每天都要打交道的核心数据类型。但你真的分清 String、StringBuffer 和 StringBuilder 三者的区别了吗?

为什么有的场景用 String 会导致性能瓶颈?为什么多线程下拼接字符串必须用 StringBuffer?这篇文章带你从底层原理到实战场景,彻底搞懂这三者的异同,让你在面试和开发中不再踩坑。


一、核心区别:不可变 vs 可变

这是三者最本质的区别,也是理解后续所有特性的基础。

1. String:不可变的字符序列

String 类是 不可变 的,这意味着一旦一个 String 对象被创建,它的内容就无法被修改。

底层原理

在 JDK 9 之前,String 的底层是 char[] 数组;JDK 9 及以后,为了节省内存,底层被优化为 byte[] 数组(同时引入 coder 字段标识编码)。

关键在于,String 类被 final 修饰,且内部的字符数组也被 private final 修饰,没有提供修改数组的方法。

示例:看似修改,实则创建新对象

Strings="hello";s+=" world";// 实际执行:s = new String(s + " world")System.out.println(s);// 输出 hello world

注意:上述代码中,s += “world” 并不是在原字符串上修改,而是创建了一个新的 String 对象。频繁拼接会产生大量临时对象,导致性能下降。

2. StringBuffer & StringBuilder:可变的字符序列

StringBuffer 和 StringBuilder 都继承自 AbstractStringBuilder,底层同样是字符数组,并且支持动态扩容。

它们的核心特点是:修改操作直接在原对象上进行,不会创建新对象。

示例:高效拼接

StringBuildersb=newStringBuilder("hello");sb.append(" world");// 直接在原对象上追加,无新对象产生System.out.println(sb);// 输出 hello world

二、线程安全:线程安全 vs 非线程安全

这是 StringBuffer 和 StringBuilder 最关键的区别。

线程安全实现方式性能
StringBuffer安全方法被 synchronized 修饰较低
StringBuilder不安全方法无同步锁较高

1. StringBuffer:线程安全的选择

StringBuffer 的所有核心方法(如 append()、insert()、reverse())都被 synchronized 关键字修饰,保证了多线程环境下的操作原子性。

适用场景:多线程并发操作字符串的场景,例如:多线程日志拼接、分布式系统中的字符串组装。

2. StringBuilder:单线程高性能之选

StringBuilder 是 JDK 5 新增的类,它去掉了 StringBuffer 的同步锁,因此在单线程下性能远高于 StringBuffer。

适用场景:单线程环境下的字符串拼接,例如:循环拼接字符串、业务逻辑中的局部字符串处理(这也是开发中最常用的场景)。

三、性能对比:谁才是效率之王

我们通过一段代码,直观感受三者的性能差异:

publicclassStringPerformanceTest{publicstaticvoidmain(String[]args){inttimes=100000;// 拼接次数// 1. String 拼接longstart1=System.currentTimeMillis();Strings="";for(inti=0;i<times;i++){s+="a";}longend1=System.currentTimeMillis();System.out.println("String 耗时:"+(end1-start1)+"ms");// 2. StringBuffer 拼接longstart2=System.currentTimeMillis();StringBuffersb1=newStringBuffer();for(inti=0;i<times;i++){sb1.append("a");}longend2=System.currentTimeMillis();System.out.println("StringBuffer 耗时:"+(end2-start2)+"ms");// 3. StringBuilder 拼接longstart3=System.currentTimeMillis();StringBuildersb2=newStringBuilder();for(inti=0;i<times;i++){sb2.append("a");}longend3=System.currentTimeMillis();System.out.println("StringBuilder 耗时:"+(end3-start3)+"ms");}}

运行结果(仅供参考):

String耗时:8921msStringBuffer耗时:5msStringBuilder耗时:2ms

结论:

  • String:频繁拼接时性能最差,不建议在循环中使用。
  • StringBuilder:单线程下性能最优,推荐优先使用。
  • StringBuffer:性能略低于 StringBuilder,仅在多线程场景下使用。

四、使用场景总结:什么时候用谁?

核心特性适用场景
String不可变、线程安全字符串常量、少量字符串拼接、字符串比较场景
StringBuffer可变、线程安全多线程并发的字符串拼接场景
StringBuilder可变、非线程安全单线程的大量字符串拼接场景(开发首选)

开发避坑指南

  1. 避免在循环中使用 String 拼接:改用 StringBuilder,否则会产生大量临时对象,触发频繁 GC。
  2. 多线程场景别用 StringBuilder:否则可能出现字符串内容错乱的问题。
  3. 明确字符串长度时,指定初始容量:StringBuilder sb = new StringBuilder(1000); 可以减少扩容次数,进一步提升性能。

五、面试高频问题

为什么 String 是不可变的?

答:String 类被 final 修饰,内部字符数组被 private final 修饰,且没有提供修改数组的方法。不可变性保证了字符串的安全性和哈希值的稳定性。

StringBuffer 和 StringBuilder 的区别?

答:核心是线程安全,StringBuffer 方法加了 synchronized 锁,线程安全但性能低;StringBuilder 无锁,性能高但线程不安全。

为什么不推荐用 StringBuffer?

答:大多数开发场景是单线程,StringBuilder 性能更高;只有多线程场景才需要 StringBuffer。


总结

String、StringBuffer 和 StringBuilder 的区别,本质上是 不可变 vs 可变、线程安全 vs 性能 的权衡。记住一句话:单线程用 StringBuilder,多线程用 StringBuffer,字符串常量用 String。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 8:24:04

Power BI主题模板:重塑数据可视化的专业标准

Power BI主题模板&#xff1a;重塑数据可视化的专业标准 【免费下载链接】PowerBI-ThemeTemplates JSON Templates for assembling Power BI Themes 项目地址: https://gitcode.com/gh_mirrors/pow/PowerBI-ThemeTemplates 在数据驱动决策的时代&#xff0c;Power BI主题…

作者头像 李华
网站建设 2026/4/18 8:18:40

Kotaemon股票行情问答:投资者信息获取新方式

Kotaemon股票行情问答&#xff1a;投资者信息获取新方式 在金融投资的世界里&#xff0c;时间就是信息&#xff0c;信息就是决策。一个散户投资者想了解“宁德时代最近的研发投入趋势如何”&#xff0c;过去可能需要打开多个网页&#xff1a;先查年报PDF、再翻券商研报、对比历…

作者头像 李华
网站建设 2026/4/16 12:13:56

5分钟掌握Scratch跨平台打包工具:让你的创意作品随处运行

5分钟掌握Scratch跨平台打包工具&#xff1a;让你的创意作品随处运行 【免费下载链接】packager Converts Scratch projects into HTML files, zip archives, or executable programs for Windows, macOS, and Linux. 项目地址: https://gitcode.com/gh_mirrors/pack/package…

作者头像 李华
网站建设 2026/4/10 16:52:47

哪些查重率软件可以在线检测?2025年全面指南

在数字化学术时代&#xff0c;查重已成为保障学术成果原创性的标准流程。选择一款合适的在线查重软件&#xff0c;不仅能有效检测文本相似度&#xff0c;还能提供修改建议&#xff0c;帮助学生和研究者提升论文质量。面对市场上众多的查重工具&#xff0c;了解它们的特点和适用…

作者头像 李华
网站建设 2026/3/28 5:33:30

XChart完全指南:从基础图表到高级可视化

XChart完全指南&#xff1a;从基础图表到高级可视化 【免费下载链接】XChart 项目地址: https://gitcode.com/gh_mirrors/xch/XChart XChart作为Java生态中备受推崇的数据可视化库&#xff0c;为开发者提供了强大而灵活的图表绘制能力。无论你是数据科学研究者、后端开…

作者头像 李华
网站建设 2026/4/18 8:28:29

ExoPlayer跨设备兼容性实战指南:解决90%播放难题的技术分享

ExoPlayer跨设备兼容性实战指南&#xff1a;解决90%播放难题的技术分享 【免费下载链接】ExoPlayer 项目地址: https://gitcode.com/gh_mirrors/ex/ExoPlayer 你是否遇到过这样的场景&#xff1a;在华为手机上播放视频时突然黑屏&#xff0c;小米设备上音频莫名中断&am…

作者头像 李华