顾名思义,AbstractStringBuilder类是一个抽象类。String类基本上等价于一个不可变的基本数据类型,但是,我们对于String具有很高的期望,希望它是可变的,这样我们就可以做很多事了。于是,就有了StringBuffer和StringBuilder。在阅读StringBuffer和StringBuilder前,有必要先读读它们的父类AbstractStringBuilder类。
AbstractStringBuilder类的定义如下:
abstract class AbstractStringBuilder implements Appendable, CharSequence{
/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
}
可以看到, 和String类一样,它内部同样定义了一个char数组来存储每一个字符。同时,还有一个count属性,用来保存字符的总数,也就是char数组的长度。这些都没什么难理解的。比较有意思的是下面的这一系列重新确定字符总数的最小长度的方法:
public void ensureCapacity(int minimumCapacity) {
if (minimumCapacity > 0)
ensureCapacityInternal(minimumCapacity);
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
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;
}
private int hugeCapacity(int minCapacity) {
if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
throw new OutOfMemoryError();
}
return (minCapacity > MAX_ARRAY_SIZE)
? minCapacity : MAX_ARRAY_SIZE;
}
各种append方法:
各种insert方法:
其他的方法,大致就是想String类一样的对char数组操作的封装了: