String、StringBuilder、StringBuffer虽然都与Java的字符串有关,但是它们之间存在一定地区别。
一 String是字符串常量,而StringBuilder、StringBuffer是字符串变量
String对象在创建之后时候不可变的,这种不可变造成了在对String实施改变操作时,JVM会重新创建一个String对象。
String s="qwe";// 1
System.out.println(s); //2
s=s+"as";// 3
System.out.println(s); //4
例如,上面这段代码,第1步对s赋值,在第3步想对s追加字符串,这时JVM会新建一个字符串qweas,而第1步的“qwe”会被GC回收。因此,如果对String对象频繁的进行修改,速度很慢且造成内存浪费。
StringBuilder、StringBuffer对象都是变量,它们都继承自AbstractStringBuilder。对于二者的append()方法,内部实现使用的是System.arraycopy()方法,因此改变对象值的时候不需要重建,速度上更快。
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
public AbstractStringBuilder append(char[] str) {
int len = str.length;
ensureCapacityInternal(count + len);
System.arraycopy(str, 0, value, count, len);
count += len;
return this;
}
二 线程安全性
这里主要强调的是StringBuilder和StringBuffer。StringBuilder是线程不安全的,而StringBuffer是线程安全的,StringBuffer里的方法均由synchronized修饰,保证了安全。因此在多线程的场景里,使用StringBuffer,否则使用StringBuilder。
总结如下:
String适用于对字符串修改较少的场景
StringBuffer适合多线程频繁修改字符缓冲区的场景
StringBuilder适合单线程频繁修改字符缓冲区的场景