String/StringBuffer/StringBuilder区别

String类是我们在java编程中十分常用的一个类,尤其对于刚入门的初学者,无疑是对字符串进行操作最为理想的工具。可当我们进一步接触java后,会发现还有StringBuffer和StringBuilder两个与其相似的类,这两个类的功能几乎和String类完全相同。那么,这三者之间到底有何深层次的区别呢?我将从以下几个方面进行比较:

  • 修改字符串的具体操作
  • StringBuffer/StringBuilder区别
  • 运行速度
  • 适用场景

修改字符串的具体操作

以下方两段代码为例:

String  str = "abc";
System.out.println(str);
str += "jk";
System.out.println(str);
StringBuffer str = new StringBuffer("abc");
System.out.println(str);
str.append("jk");
System.out.println(str);

上方第一段代码使用String类修改字符串,第二段代码使用StringBuffer类(StringBuild类同)修改字符串,虽输出结果相同,但在内存中的操作并不相同。
String类在进行操作时,由于初始化的空间仅刚好能存下值“abc”,空间大小又无法改变。所以,首先会在内存中开辟一块新空间,使其大小刚好能存入值“abcjk”,随后将str对象指向新空间的地址,最后利用JVM的GC机制对存储数据的原空间进行回收。
StringBuffer(StringBuild)类与其不同的是,它在进行初始化空间时,除了能存下值“abc”外,还有一定的空间剩余进行缓冲,所以进行操作时可以在原空间内直接修改数据,无需新开辟空间。

StringBuffer/StringBuilder区别

对此二者进行区别,我们可以通过查看源码比较出StringBuffer类的多数方法都有synchronized关键字,而StringBuild类则无。该关键字能在多线程任务中保证线程安全,使各线程依次独立执行方法,互不干扰。据此,可以总结出StringBuffer和StringBuilder的区别主要体现在线程安全方面,StringBuffer具有更好地线程安全性能,但在运行速度方面必然也有所损失,这一点在后面会继续讲到。

运行速度

通过之前的比较不难得出,String类的运行速度在三者中最慢,因为该类每处理一次数据都要开辟新空间并对原空间进行回收;而StringBuild相比StringBuffer不需要考虑线程安全问题,在运行速度方面必然也更有优势,在三者中速度最快。
运行速度:StringBuild > StringBuffer > String。

适用场景

以下用一个表格更直观的进行区别:

数据程序
String少量字符串————
StringBuffer大量字符串多线程应用程序
StringBuild大量字符串单线程应用程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值