String、StringBuilder、StringBuffer 的区别?
String:用于字符串操作,属于不可变类;【补充:String 不是基本数据类型,是引用类型,底层用 char 数组实现的】
StringBuilder:与 StringBuffer 类似,都是字符串缓冲区,但线程不安全;
StringBuffer:也用于字符串操作,不同之处是 StringBuffer 属于可变类,对方法加了同步锁,线程安全
StringBuffer的补充
说明:StringBuffer 中并不是所有方法都使用了 Synchronized 修饰来实现同步:
@Overridepublic StringBuffer insert(int dstOffset, CharSequence s) {
// Note, synchronization achieved via invocations of other StringBuffer methods
// after narrowing of s to specific type
// Ditto for toStringCache clearing
super.insert(dstOffset, s);
return this;
}
执行效率:StringBuilder > StringBuffer > String
评论(4)
String:用于字符串操作,属于不可变类
StringBuilder:用于字符串操作,可变类,线程不安全
StringBuffer:用于字符串操作,可变类,对方法加了同步锁,线程安全
执行效率:StringBuilder > StringBuffer > String
线程安全:
当多个线程访问某一个类(对象或方法)时,对象对应的公共数据区始终都能表现正确,那么这个类(对象或方法)就是线程安全的
在1.8及以前,String类底层使用的是char[],1.9之后改成了byte[]
因为字符串较多是拉丁字母,只需要一个字节就可以存储,char多出来的一个字节容易浪费,gc更频繁
String不可变是因为char[]数组被final修饰了,而StringBuilder和StringBuffer没有
(继承了AbstractStringBuilder中的数组)
为了实现线程同步,需要牺牲一部分的效率,所以StringBuilder的效率要比StringBuffer高
String不可变不是因为char数组被final修饰了,修饰了后最多是数组的引用不可变,然而数组元素还是可变的,应该是String类没有提供修改的API