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 | 大量字符串 | 单线程应用程序 |