- String对象不能被修改,本身不能修改,但是引用可以修改。
String a = "abc" 实在内存里创建了一个String对象 a = a+'c' 实际上是在内存中"abcc" 的String对象
- stringBuffer和stringBuilder可变
- stringBuffer效率比stringBuilder低,但是线程安全,而
stringBuilder线程不安全
- 原因在于StringBuffer在append()方法上使用了
synchronized
,而StringBuilder没有使用。 - StringBuilder和StringBuffer都继承了
AbstractStringBuilder
- AbstractStringBuilder内有两个非常重要的变量,分别是:
char[] value,int count
- Stringbuff 和Stringbuider 是可以修改,因为
value没有加上final
- String可以空赋值,stringBuffer和stringBuilder不行
- StringBuffer比StringBuilder多了一个toStringCache字段,用来在toString方法中进行缓存,每次append操作之前都先把toStringCache设置为null,若多次连续调用toString方法,可避免每次Arrays.copyOfRange(value, 0, count)操作,节省性能。
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
单线程StringBuffer与StringBuilder区别
单线程下StringBuffer加了synchronized,虽然是单线程, 但是synchronized获取锁和释放锁也还是需要时间
的, 而StringBuilder没有,这个就是重点区别。
StringBuffer虽然是单线程,但它是有偏向锁升级过程判断的,会耗费时间,效率固然低于StringBuilder
StringBuilder没有加任何锁,其效率高,适用单线程场景,但同时也适用于高并发场景中,提高高并发场景下程序的响应性能,至于线程安全问题可以通过其它手段解决,如ThreadLocal,CAS操作等