情景:公司项目在拼接sql时用到了StringBuilder类,为此深挖一下
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{
}
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
}
StringBuffer和StringBuilder都是继承AbstractStringBuilder父类 实现的接口也都相同,两个类都有append()方法,进入源码
StringBuilder.append()
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuffer.append()
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
可以看到StringBuffer的append方法加了synchronized(同步)关键字修饰,自己理解是加锁,方法是线程安全的,所以速度要慢些,对应的,StringBuilder没有加同步关键字,线程不安全,速度快。
拓展:append方法中如果默认字符长度(16)不够,形成新的字符数组长度会*2+2,源码如下:
int newCapacity = (value.length << 1) + 2;
这里 x<<n 运算符实际测试了下,是x乘以2的n次方
x<<1=2x; x<<2=4x; x<<10=1024x;
/**
* string机制
* string对象不可修改 string str= "a",str = "b"
* 逻辑是先在内存中创建String对象,对象的值为 a,然后这个实例对象指向str这个引用变量
* str = "b"是再新开辟一片内存空间,创建string对象。值为b,指向str,并不是直接改原来对象的值
*/