你还在使用 StringBuffer ?

简介: Java中常用字符串处理类包括 String、StringBuffer 和 StringBuilder ,当对字符串进行修改的时候,使用 StringBuffer 和 StringBuilder 一般比使用 String 效率更高。因为 StringBuffer 的内部实现方式和 String 不同,StringBuffer 在进行字符串处理时,不生成新的对象,在速度和内存使用上都要优于 String。

介绍


      Java中常用字符串处理类包括 String、StringBuffer 和 StringBuilder ,当对字符串进行修改的时候,使用 StringBuffer 和 StringBuilder 一般比使用 String 效率更高。因为 StringBuffer 的内部实现方式和 String 不同,StringBuffer 在进行字符串处理时,不生成新的对象,在速度和内存使用上都要优于 String。

String


     String 是被 final 关键字修饰的,它是不可变的,就算调用 String 的 concat 方法,那也只是把字符串拼接起来并重新创建一个新对象,把拼接后的 String 的值赋给新创建的对象。


StringBuffer


      StringBuffer 是可变的,调用StringBuffer 的 append 等方法,来改变 StringBuffer ,相比较于 String 创建新对象,StringBuffer 的 append 等方法直接在原对象上操作,不新建对象,是更高效的,所以如果需要对字符串进行修改推荐使用 StringBuffer。


StringBuilder


     StringBuilder 在 Java 5 中被提出,它拥有与 StringBuffer 几乎相同的方法与用法,但是无论哪方面都完胜 StringBuilder。


StringBuffer vs StringBuilder


     StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder,在 AbstractStringBuilder 类中也是使用字符数组保存字符串。StringBuffer 很多方法都是 synchronized 修饰的,所以我们常说 StringBuffer 是线程安全的,官方的注释也写着 StringBuffer 是一个线程安全的可变的字符序列,StringBuffer 可以安全的在多线程场景下使用,但事实并非如此。


     事实上,StringBuffer 不是线程安全的而且效率低下,任何出现 StringBuffer 的地方都可以用 StringBuilder 去替换。道理很简单, append 等方法在多线程环境下,它能保证程序运行结果的正确性和一致性吗?试想一下,使用 append 拼接 SQL,在多线程环境运行,你根本无法预测最终结果,不光无法预测,JVM 自己都不确定最终结果。

 StringBuffer 的线程安全,仅仅是保证 JVM 不抛出异常顺利的往下执行而已,它不保证逻辑正确和调用顺序正确。大多数时候,我们需要的不仅仅是线程安全,而是锁。事实上,你根本找不到一个用 StringBuffer 的理由,《Effective java》的作者 Joshua Bloch 在书中说:


原文:StringBuffer instances are almost always used by a single thread, yet they perform internal synchronization. It is for this reason that StringBuffer was supplanted by StringBuilder, which is just an unsynchronized StringBuffer.


译文:StringBuffer 实例几乎总是由单个线程使用,但它们执行内部同步。正是由于这个原因,StringBuffer 被 StringBuilder 取代,后者只是一个不同步的StringBuffer。


为什么会有 StringBuffer 的存在呢?如果真的没有价值,为什么 JDK 会提供这个类?


      因为最早是没有 StringBuilder 类的,sun 公司的人错误地决定让 StringBuffer 是线程安全的,然后大约 10 年之后,人们终于意识到这是一个多么愚蠢的决定,意识到在这 10 年之中这个愚蠢的决定为 Java 运行速度慢这样的流言贡献了多大的力量,于是,在 JDK1.5 的时候,终于决定提供一个非线程安全的 StringBuffer 实现,并命名为 StringBuilder 。


总结

999e68356394a465cbbe8e6efb39011.jpg

StringBuffer 基本没有适用场景,你应该在所有的情况下坚定地选择使用 StringBuilder。

————————————————

版权声明:本文为CSDN博主「Acx7」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Acx77/article/details/120706773

相关文章
|
数据采集 自然语言处理 大数据
​「Python大数据」LDA主题分析模型
使用Python进行文本聚类,流程包括读取VOC数据、jieba分词、去除停用词,应用LDA模型(n_components=5)进行主题分析,并通过pyLDAvis生成可视化HTML。关键代码涉及数据预处理、CountVectorizer、LatentDirichletAllocation以及HTML文件的本地化处理。停用词和业务术语列表用于优化分词效果。
732 0
​「Python大数据」LDA主题分析模型
|
10天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
9天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
410 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
3天前
|
存储 安全 前端开发
如何将加密和解密函数应用到实际项目中?
如何将加密和解密函数应用到实际项目中?
199 138
|
9天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
380 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
3天前
|
存储 JSON 安全
加密和解密函数的具体实现代码
加密和解密函数的具体实现代码
198 136
|
21天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1355 8
|
8天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。