StringBuffer和StringBuilder皆extends AbstractStringBuilder
StringBuilder单线程使用,StringBuffer多线程使用,其他的基本一样。
//空的SB初始大小为16
public StringBuffer(){
super(16)
}
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
- 在向StringBuffer添加内容之前(append),代码会首先确定是否需要进行扩容。StringBuffer和StringBuilder的扩容皆继承自AbstractStringBuilder
public void ensureCapacity(int minimumCapacity) {
if (minimumCapacity > 0)
ensureCapacityInternal(minimumCapacity);
}
/**
* This method has the same contract as ensureCapacity, but is
* never synchronized.
*/
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0)
expandCapacity(minimumCapacity);
}
/**
* This implements the expansion semantics of ensureCapacity with no
* size check or synchronization.
*/
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2; //两倍长度+2
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
- append方法主要基于两种实现,一种是调用System.arraycopy方法,另一种就是在char[]后面进行添加,实际上两种方式都是在数组后添加,只不过一种是调用System的,一种是jdk实现的。
- delete,deleteChar,replace等方法都是对char[]进行特定长度的复制+替换操作,使用System.arraycopy方法进行操作。
- insert方法则是首先进行扩容,然后利用System.arraycopy方法进行复制,在进行insert操作。
网友评论