String,StringBuffer和StringBuilder的区别

  面试的时候经常问到的一个题:这里先说明下三者在JVM中的执行速度:StringBuilder > StringBuffer > String,原因且看下面慢慢阐述。

  首先看一个概念,为啥一个是常量,另外两个是变量,详细可见JDK中源码的修饰符。

  String:字符串常量

  StringBuilder:字符串变量

  StringBuffer:字符串变量

 

  首先看一段简单的代码:这段代码看似简单,实际上很多人不懂JVM执行的原理,首先JVM创建了str的对象,并赋予了"abc"的值,而后再次创建一个新的str的对象,并由原先的str对象拼接上 "d",最终赋值为"abcd",而原先的str的对象则被垃圾回收掉了。看JDK的源码可知,String类的修饰符是final的,所以对象是无法被修改的,因此每次对String对象的切割,拼接等操作,实际上new出了很多对象,所以这样的原因导致了操作String的速度变慢。

String str = "abc";
str = str + "d";

  但StringBuilder和StringBuffer不一样,他们是字符串变量,是可变的对象,每次对他们的操作都是在一个对象上操作的,所以速度自然就变快了。

  

  StringBuilder和StringBuffer的比较:

  StringBuilder是线程不安全的,而StringBuffer是线程安全的。何为线程安全?

  线程安全:如果你的程序是一个进程中运行的,而该进程中跑着多个线程,并且可能同时操作该部分相同的程序,若每次运行的结果和单线程执行的结果相同,并且变量值和预       期的结果也是相同的,那么称之为线程安全。

   

  结论

  对三者的使用建议如下:对少量的字符串数据操作使用String

             单线程场景下操作大量的字符串数据使用StringBuilder,因为速度最快。

               多线程场景下操作大量的字符串数据使用StringBuffer,因为线程安全。

posted @   纪煜楷  阅读(342)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示