StringBuffer的容量是多少?

时间:2011-11-04 15:19:20

标签: java stringbuffer

当我运行此代码时:

StringBuffer name = new StringBuffer("stackoverflow.com");
System.out.println("Length: " + name.length() + ", capacity: " + name.capacity());

它给出了输出:

  

长度:17,容量:33

明显的长度与字符串中的字符数有关,但我不确定容量是多少? 在重新分配空间之前,StringBuffer可以容纳的字符数是多少?

14 个答案:

答案 0 :(得分:9)

请参阅:JavaSE 6 java.lang.StringBuffer capacity()

但你的假设是正确的:

  

容量是新插入字符可用的存储量,超出该容量将发生分配

答案 1 :(得分:3)

是的,你是对的,请参阅JavaDoc了解更多信息:

  

只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。如果内部缓冲区溢出,它会自动变大。

答案 2 :(得分:2)

内部StringBuffer使用char数组来存储字符。容量是char数组的初始大小。

可以从http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html

找到更多信息

答案 3 :(得分:2)

来自http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html#capacity%28%29

  

public int capacity()

     

返回当前容量。容量是新插入字符可用的存储量,超出该容量将进行分配。

同样来自同一份文件

  

从JDK 5发布版开始,这个类已经补充了一个设计用于单个线程StringBuilder的等效类。 StringBuilder类通常应优先于此使用,因为它支持所有相同的操作,但速度更快,因为它不执行同步。

答案 4 :(得分:2)

取自官方J2SE文档

  

容量是新插入字符可用的存储量,超出该容量将进行分配。

它的长度通常是+ 16,这是最小分配,但是一旦字符数量,即它的大小超过分配的数量,StringBuffer也增加它的大小(按固定数量),但是将分配多少数量,我们无法计算出来。

答案 5 :(得分:2)

是的,就是这样。在这方面你可以认为StringBuffer有点像Vector<char>(除了显然你不能在Java中使用char作为类型参数...)

答案 6 :(得分:2)

  

每个字符串缓冲区都有容量。只要长度了   字符串缓冲区中包含的字符序列不超过   容量,没有必要分配新的内部缓冲区数组。   如果内部缓冲区溢出,它会自动变大。

来自:http://download.oracle.com/javase/1.4.2/docs/api/java/lang/StringBuffer.html

答案 7 :(得分:2)

StringBuffer有一个char [],在其中保存附加到它的字符串。当前分配给该缓冲区的内存量是容量。目前使用的金额是长度。

答案 8 :(得分:2)

这是内部缓冲区的大小。正如Javadoc所说:

  

每个字符串缓冲区都有容量。只要长度了   字符串缓冲区中包含的字符序列不超过   容量,没有必要分配新的内部缓冲区数组。   如果内部缓冲区溢出,它会自动变大。

答案 9 :(得分:1)

“每个字符串缓冲区都有容量。只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。如果内部缓冲区溢出,则自动变大。“

http://download.oracle.com/javase/1.3/docs/api/java/lang/StringBuffer.html -see capacity()和ensurecapacity()

答案 10 :(得分:1)

容量是新插入字符可用的存储量。它与length()不同。如果字符数小于16,则length()返回字符总数,容量返回值16。但是如果字符数超过16,则字符数为+16。 在这种情况下,没有字符= 17 SO,容量= 17 + 16 = 33

答案 11 :(得分:0)

伊万,刚刚阅读了capacity()的文档 - 它直接回答了你的问题......

答案 12 :(得分:0)

StringBuffer / StringBuilder类的初始容量为16。 如果您的String的长度变为> 16,这是第一次。 StringBuffer / StringBuilder类的容量增加到34,即[(16 * 2)+2]

但是当String的长度变为&gt; 34时,StringBuffer / StringBuilder类的容量将完全等于String的当前长度。

答案 13 :(得分:0)

答案已经为时已晚,但是希望这可能对某人有所帮助。

当我们使用StringBuffer的 default 构造函数时,分配的容量为 16

StringBuffer name = new StringBuffer();
System.out.println("capacity: " + name.capacity()); /*Output - 16*/

但是如果使用 String自变量,则StringBuffer的构造函数的容量计算如下所示

StringBuffer sb = new StringBuffer(String x);

容量=默认的StringBuffer容量+ x.length()

解决方案:

StringBuffer name = new StringBuffer("stackoverflow.com");
System.out.println("Length: " + name.length() + ", capacity: " + name.capacity());

容量计算:容量= 16 + 17