StringBuffer str = new StringBuffer();
str.append("大家好我们大家都很愿意学习java语言");
System.out.println("length:"+str.length());   //返回19,因为初始化的16个字符空间已经不够,这时会自动扩容
System.out.println("Capacity:"+str.capacity());  //返回34那么这个str.capacity()为34是如何得出的呢??查了api也只是草草地说这个方法是“返回当前容量”的意思。希望各位高手能对这个方法进行详细,只要说出这34是如何得出的就行了,谢谢

解决方案 »

  1.   

    capacity()返回StringBuffer的容量, length()返回StringBuffer里放着的字符串的长度。
      

  2.   

    看看源代码就知道了。AbstractStringBuilder
    不过这种问题就算知道了也没多大意义吧。#  /**
    # * This implements the expansion semantics of ensureCapacity with no
    # * size check or synchronization.
    # */
    # void expandCapacity(int minimumCapacity) {
    #     int newCapacity = (value.length + 1) * 2;
    #     if (newCapacity < 0) {
    #         newCapacity = Integer.MAX_VALUE;
    #     } else if (minimumCapacity > newCapacity) {
    #         newCapacity = minimumCapacity;
    #     }
    #     char newValue[] = new char[newCapacity];
    #     System.arraycopy(value, 0, newValue, 0, count);
    #     value = newValue;
    # } 
      

  3.   

    StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候, StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容 量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。     如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第17(原文是16,其实是错误的,因为在追加到第16个字符的时候,容量不会发生变化,很抱歉,以后会更严谨一些^+^)个字符的时候它会将容量增加 到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。无论何事只要StringBuffer 到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍。所以给 StringBuffer设置一个合理的初始化容量值,会提升程序的性能。 
      

  4.   


    /**
         * The value is used for character storage.
         */
        char value[];    /** 
         * The count is the number of characters used.
         */
        int count;    public synchronized int length() {
    return count;
        }
        public synchronized int capacity() {
    return value.length;
        }
    源码如上面所示:
    可知: 
    length返回的字符的个数
    capacity返回的是储存字符所需的字节数
      

  5.   

    还是没解决我将字符串改成“我们大家都很愿意学习java语言zzzzzzzzzzzzzzzzzzzz”那么这个时候方法capacity()返回的却是39就变成了什么呢?超出16为34,超出34后就变成多几个字符加几个字符
    如果说是new StringBuffer(String s)这个构造方法呢,又该如何计算呢?
      

  6.   

    答:楼主的一定要弄清楚问题的精神令人佩服。这是学任何东西都要有的态度。
    1)new StringBuffer(String s)这个构造方法呢,又该如何计算呢?
    答:s.length() + 16,然后再append(s);2)new StringBuffer(); 
    答:16。
    那么:append(s);是如何扩容的呢?其实4楼的代码已经说得很清楚了
    思想是:最小容量是:当前的长度+串长,拟扩充的新容量是:(旧容量+1)*2
    若:最小容量>拟扩充的新容量,则按最小容量扩充,否则(拟扩充的新容量>=最小容量):就按拟扩充的新容量扩充。楼主的第一次串:
    StringBuffer str = new StringBuffer(); //容量是16
    str.append("大家好我们大家都很愿意学习java语言"); //扩容。如何扩?
    最小容量是:0(当前长度是0)+19(那个要append的串长)=19
    拟扩充的新容量:(16+1)*2=34
    因为:最小容量<拟扩充的新容量,则此时按:拟扩充的新容量即34进行扩容。
    楼主的第二次串:
    StringBuffer str = new StringBuffer(); //容量是16
    str.append("我们大家都很愿意学习java语言zzzzzzzzzzzzzzzzzzzz"); //扩容。如何扩?最小容量是:0(当前长度是0)+36(那个要append的串长)=36
    拟扩充的新容量:(16+1)*2=34
    因为:最小容量>拟扩充的新容量,则此时按:最小容量即36进行扩容。
      

  7.   

    自己做下实验,当StringBuffer实例长度大于16,容量会自动变为(旧值+1)*2