關於StringBuffer的長度問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章