在StringBuffer類中,提供了衆多的方法,可以向StringBuffer中添加字符,字符串,數字,布爾,對象等等。當new出一個新的StringBuffer時,它的capacity(容量)就初始化爲16,長度爲0,在添加字符串時,字符串中有多少個字符,StringBuffer的length就是多少,這都是顯而易見的了。但是,如果向StringBuffer中添加數字呢?那StringBuffer的長度怎麼變?
通過看StringBuffer的源代碼,可以看到StringBuffer的length方法繼承自AbstractStringBuffer這個類,在這個類中有關於length的算法
/* 來自JDK源碼AbstractStringBuffer */
public AbstractStringBuilder append(int i) {
if (i == Integer.MIN_VALUE) {
append("-2147483648");
return this;
}
int appendedLength = (i < 0) ? Integer.stringSize(-i) + 1
: Integer.stringSize(i);
int spaceNeeded = count + appendedLength;
ensureCapacityInternal(spaceNeeded);
Integer.getChars(i, spaceNeeded, value);
count = spaceNeeded;
return this;
}
這裏面看到length增加的數字取決於Integer類的stringSize方法,轉到這個方法中:
/* 來自JDK源碼Integer */
final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };
// Requires positive x
static int stringSize(int x) {
for (int i=0; ; i++)
if (x <= sizeTable[i])
return i+1;
}
根據這個可以看出當添加的整型數在 0到9 (閉區間)的範圍是,,StringBuffer的length 加 1,
當添加的整形數的範圍在 -9到-1 && 10到99時,StringBuffer的length 加 2,
當添加的數的範圍在 -99 到 -10 && 100到999時, StringBuffer 的length 加 3.
以後依次類推。。
說完了添加int型的,那麼添加boolean時StringBuffer的長度怎麼變呢?
還是在AbstractStringBuffer 中尋找答案:
/*來自JDK源碼AbstractStringBuffer */
public AbstractStringBuilder append(boolean b) {
if (b) {
ensureCapacityInternal(count + 4);
value[count++] = 't';
value[count++] = 'r';
value[count++] = 'u';
value[count++] = 'e';
} else {
ensureCapacityInternal(count + 5);
value[count++] = 'f';
value[count++] = 'a';
value[count++] = 'l';
value[count++] = 's';
value[count++] = 'e';
}
return this;
}
很顯然,當StringBuffer添加boolean類型時,就是按照true或是false的字符存的,由此,當添加true時,StringBuffer的length增加 4; 當添加false時,StringBuffer的length增加 5。