在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。