Stringbuffer和StringBuilder都继承AbstractStringBuilder抽象类,
大部分的逻辑处理都是在AbstractStringBuilder抽象类中实现的。
AbstractStringBuilder抽象类数据成员:
char[] value; //字符数组
int count; //字符数组长度
大部分append操作都是使用了以下方法
//扩容的方法,把字符数字长度扩展到minimumCapacity
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
//扩容的大小计算,如果要求增加的大小,还小于原本的大小+2,就增加原来的大小+2的长度,。
private int newCapacity(int minCapacity) {
// overflow-conscious code
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}
还有就是数组的复制,使用system类
/*
* @param src 源数组
* @param srcPos 从源数组的srcpos下标开始
* @param dest 目标数组
* @param destPos 从源数组的destPos 下标开始
* @param length 复制的长度
*
* */
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
StringBuilder的继承了AbstractStringBuilder抽象类
StringBuilder是线程不安全的
看源码可以发现大部分都是桥接作用,
如
//没有实现逻辑,直接交给父类处理
@Override
public StringBuilder append(int i) {
super.append(i);
return this;
}
而StringBuffer是线程安全的,
它的大部分逻辑也是交给父类处理的,和上面一样,
要说StringBuffer和StringBuilder的区别,基本上就是把大多数需要同步的方法加上了synchronized
如,和stringbuilder没有啥差别:
@Override
public synchronized StringBuffer append(int i) {
toStringCache = null;//这个是用来toString的时候返回出去的字符数组,一旦有改动原来数组就要把这个缓存置空
super.append(i);
return this;
}
//下面是缓存
@Override
public synchronized String toString() {
if (toStringCache == null) {//如果缓存不为空,就缓存一个
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}