筆記:StringBuffer的清空方式setLength和delete的比較區別
阿新 • • 發佈:2018-12-16
無聊拔碼看了這個類
1.先看setLength,簡單就是將count直接賦值為0,但是value沒有任何清除
public void setLength(int newLength) { if (newLength < 0) throw new StringIndexOutOfBoundsException(newLength); ensureCapacityInternal(newLength); if (count < newLength) { Arrays.fill(value, count, newLength, '\0'); } count = newLength; }
我們setLength(0)後在append的時候操作
public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); // 此時count為0 len為當前插入串的長度 count += len; // 重新標記count 在toString的時候從value的0到count的位置取出資料 return this; }
在看string 類的getChars
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) { if (srcBegin < 0) { throw new StringIndexOutOfBoundsException(srcBegin); } if (srcEnd > value.length) { throw new StringIndexOutOfBoundsException(srcEnd); } if (srcBegin > srcEnd) { throw new StringIndexOutOfBoundsException(srcEnd - srcBegin); } // 將插入字串拷貝到stringBuffer的value,這裡是0開始 System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin); }
2.delete操作 delete(0,len)
public AbstractStringBuilder delete(int start, int end) {
if (start < 0)
throw new StringIndexOutOfBoundsException(start);
if (end > count)
end = count;
if (start > end)
throw new StringIndexOutOfBoundsException();
int len = end - start;
if (len > 0) {
// delete 操作立馬回拷貝陣列,比setlength多一個拷貝操作
System.arraycopy(value, start+len, value, start, count-end);
count -= len;
}
return this;
}
所以setlength會比delete少一次System.arraycopy