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