`

String,StringBuffer,StringBulider的区别 「转」

 
阅读更多
String是固定长度的字符串,如果要发生变化必须重新生成新的实例;
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比StringBuffer 快的:
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做,在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer 要快。两者的方法基本相同。
在Java语言体系中,用于声明变量的基本数据类型只有8种:boolean,char,byte,short,int,long,float,double。

与C/C++语言不同的是java中并没有把字符串作为一种基本的数据类型,而是在java.lang包中提供了处理字符串的类String,该类用于处理“不可变”的字符串;与之对应的还有,StringBuffer类用于处理“可变的”字符串。

注意:这两种类都被声明为final型,因此不可以被当做父类继承使用。

一、String类

由类String所创建的对象在创建之后是不可以更改的,被视为常量。

举例说明:

subString是String类中重要的处理字符串的方法

String str = "Hello world!";

Str = str.subString(6);

在上述语句中,str.subString(6);重新创建了一个字符串String对象,然后把这个对象赋值给str。





二、StringBuffer类

StringBuffer类是字符串缓冲区存储类,创建是可以更改长度的字符串对象,该字符串被视为常量,可以调用类方法改变字符串的长度和内容。

实现机理:创建对象时开辟一个缓冲区存放字符串序列,可以向字符串追加、插入操等作。在超过缓存区的容量时,java会自动扩大缓冲区的容量,保证操作的安全性。





三、StringBuilder类

StringBuilder类使用方法和StringBuffer类类似。

区别:StringBuffer类适用于多线程方法,StringBuilder类适用于单线程操作。StringBuilder对象的执行效率比StringBuffer对象要高。

StringBuilder是J2SE   5.0才新增的类,在J2SE   5.0之前的版本若有相同的需求,则使用java.lang.StringBuffer。事实上,StringBuilder被设计为与StringBuffer具有相同的操作接口。在单机非多线程(Multithread)的情况下使用StringBuilder会有较好的效率,因为StringBuilder没有处理同步(Synchronized)问题。StringBuffer则会处理同步问题,如果StringBuilder会在多线程下被操作,则要改用StringBuffer,让对象自行管理同步问题。
分享到:
评论

相关推荐

    String,StringBuffer,StringBuilder区别

    总结来说,理解Java中String、StringBuffer和StringBuilder的区别,并合理选择使用哪个类,对于编写高性能Java程序是至关重要的。在进行性能敏感的操作时,选择合适的字符串处理类可以大幅提升程序的执行效率。同时...

    String、StringBuilder、StringBuffer的区别

    String、StringBuilder、StringBuffer的区别 在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这...

    正交频分复用 (OFDM) 基础收发机Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    通信工程勘察设计安全操作规程.docx

    通信工程勘察设计安全操作规程.docx

    【数据库技术】SQL入门与实战指南:从基础语法到应用场景的全面解析

    内容概要:本文是一篇面向初学者和技术爱好者的《SQL 入门与实战》指南,系统介绍了 SQL 的基本概念、功能及其应用场景。文章首先解释了 SQL 是一种用于操作关系型数据库的语言,能够执行数据的存储、查询、更新、删除以及表结构管理等操作。接着详细列举了基础语法,包括 SELECT、INSERT、UPDATE 和 DELETE 等语句的具体用法,并对常用的函数进行了分类说明,如聚合函数、字符串函数、时间函数等。此外,还深入探讨了多表连接、分组与聚合、子查询和窗口函数等进阶语法技巧。为了帮助读者更好地掌握 SQL,文中提供了从初级到高级的学习路线,并通过实际案例展示了 SQL 在后端 API 查询、数据报表分析、数据清洗与迁移等场景中的应用。最后简要比较了几种常见的数据库系统特性,强调了 SQL 在数据处理领域的重要性。 适合人群:适合初学者、实用派和技术爱好者,尤其是那些希望快速上手 SQL 并应用于实际工作的人员,如前端、后端、测试工程师、数据分析师和产品经理等。 使用场景及目标:①作为 SQL 学习入门资料,帮助读者理解 SQL 的基本概念和语法;②指导读者进行 SQL 编程实践,掌握数据查询、更新、插入、删除及表结构管理等操作;③为有经验的开发者提供进阶技巧,如多表连接、子查询、窗口函数等;④为从事数据相关工作的人员提供实用工具,提高工作效率。 其他说明:文章不仅涵盖了 SQL 的基础知识,还涉及到了一些高级主题,如事务、索引、视图、触发器等,并给出了进一步学习的书籍和在线资源推荐,鼓励读者通过持续学习来深化对 SQL 的理解和应用。

    wps办公日常使用11111111

    wps办公日常使用11111111

    卡通小熊素材PPT模板.pptx

    卡通小熊素材PPT模板

    汽车电子:MATLAB_实现CAN总线通信协议分析与故障诊断.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    支付技术基于MCP协议的支付宝AI支付工具集成:支付管理与应用场景详解

    内容概要:本文介绍了国内首个支付MCP(Model Context Protocol)框架,它定义了AI模型如何调用外部支付工具、获取支付数据并与支付服务交互。支付宝与魔搭社区合作,基于支付MCP Server框架为AI智能体提供无缝支付能力。支付MCP Server具有以下特点:支持MCP协议,简化支付接入流程;多端支持,涵盖移动端和网页端支付场景;全流程支付管理,包括支付、查询、退款等功能;灵活配置选项,满足不同开发需求。文中详细描述了支付MCP Server的功能,如创建支付、查询支付状态、发起退款和查询退款信息等,并提供了具体的配置方法和应用场景案例,如AI助手帮助用户在线购物、AI客服处理退款请求等。 适合人群:具有一定编程基础和技术背景的研发人员,尤其是对AI与支付集成感兴趣的开发者。 使用场景及目标:① 开发人员可以通过支付MCP Server快速实现支付功能,简化开发流程;② 提供全流程支付管理,增强应用的支付处理能力;③ 支持多端支付场景,提升用户体验;④ 通过灵活配置,满足不同业务需求,创造更多商业机会。 阅读建议:此资源详细介绍了支付M

    环境工程:MATLAB_实现大气污染扩散模型与可视化分析.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    【充电桩通信技术】基于云快充最新版协议的充电桩与新能源管理系统交互流程及数据格式定义:涵盖通信接口、帧类型、实时数据与运营交互等详细规范标题严格按照您的要求

    内容概要:本文档详细介绍了云快充最新版本的充电桩通讯协议,涵盖了从总则、通信协议结构、应用层报文帧格式、帧类型定义、通信协议流程、注册心跳帧类型码、实时数据帧类型码、运营交互帧类型码、运营平台设置帧类型码、车位锁通信协议、电桩远程维护帧类型码、并充模式帧类型码到附录的完整内容。重点描述了充电桩与新能源管理信息系统之间的数据交互流程、格式和内容,明确了通信接口采用TCP/IP Socket方式,支持有线网络接口和无线GPRS连接。文档还具体阐述了帧结构、数据格式定义、名词解释、各种帧类型的数据定义及流程,如上电流程、APP充电流程、刷卡充电、离线充电模式等,并提供了CRC16校验计算方法。 适合人群:从事充电桩开发、运维的技术人员,以及负责充电桩与平台对接的工程师。 使用场景及目标:①指导技术人员完成充电桩与新能源管理信息系统的对接,确保数据交互的正确性和稳定性;②帮助工程师理解并实现充电桩的各种功能,如登录认证、心跳包、实时数据传输、远程控制等;③为充电桩的日常维护和远程更新提供技术支持。 其他说明:本协议适用于交直流充电桩,交流部分数据无需上送。协议基于国网104充电桩规约,并参考GBT-27930标准。测试服务器地址为121.199.192.223,端口号为8768。文档还提供了详细的帧类型码定义和CRC16校验计算方法,确保数据传输的准确性。

    监理网站推广方案.docx

    监理网站推广方案.docx

    HI3519DV500 配置无线网依赖库以及编译脚本

    HI3519DV500 配置无线网依赖库以及编译脚本

    Clion和MinGW

    Clion和MinGW

    hardware-MLK-F6-7020.rar

    hardware_MLK-F6-7020.rar

    如何查看死锁.md

    如何查看死锁

    定制小米8-lineage22.1安卓15-fast功能项目线刷双版root 解锁bl后fast线刷

    资源说明; 1-----刷写前提是手机必须解锁bl先。而且会在fast模式刷写固件 2-----刷写方法与官方刷写步骤一样 3-----此固件为定制初始固件。可以在fast模式刷写 4-----属于适配固件。也许有个别bug。不接受请勿下载 5-----需要一定的刷机常识与动手能力的友友刷写。 6-----资源有可复制性。下载后不支持退。请知悉 7-----定制其他需求可以在csdn私信博主 博文参阅:https://csdn9.blog.csdn.net/article/details/143058308

    敏感图片敏感图片敏感图片敏感图片敏感图片敏感图片11

    敏感图片敏感图片敏感图片敏感图片敏感图片敏感图片11敏感图片敏感图片敏感图片敏感图片敏感图片敏感图片1122

    UniApp中使用renderjs进行AI对话实现流式请求及流式响应方式

    通过UniApp+vueJs+renderJs的前端框架实现一个AI对话的小功能,AI回答使用流式请求,响应流式输出的小案例。解决兼容低版本的手机端运行不支持流式Fetch的请求方式;

    铁路接触网检测:MATLAB无人机影像绝缘子定位.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

Global site tag (gtag.js) - Google Analytics