12

当我运行此代码时:

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

它给出输出:

长度:17,容量:33

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

4

14 回答 14

9

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

但你的假设是正确的:

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

于 2011-11-04T15:22:37.737 回答
3

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

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

于 2011-11-04T15:22:27.847 回答
3

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

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

于 2011-11-04T15:22:42.727 回答
2

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

更多信息可以从http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html找到

于 2011-11-04T15:21:24.873 回答
2

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

公共 int 容量()

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

也来自同一个文档

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

于 2011-11-04T15:21:27.953 回答
2

取自官方 J2SE 文档

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

它一般是length+16,是最小分配,但是一旦字符的个数,即它的大小超过分配的一个,StringBuffer也会增加它的大小(按固定数量),但是分配多少数量,我们不能计算它。

于 2011-11-04T15:21:45.150 回答
2

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

于 2011-11-04T15:21:45.147 回答
2

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

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

于 2011-11-04T15:22:17.007 回答
2

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

于 2011-11-04T15:22:20.910 回答
1

"每个字符串缓冲区都有一个容量,只要字符串缓冲区包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲区数组。如果内部缓冲区溢出,则自动进行更大。”

http://download.oracle.com/javase/1.3/docs/api/java/lang/StringBuffer.html - 查看容量()和确保容量()

于 2011-11-04T15:25:36.797 回答
1

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

于 2016-06-26T12:03:59.767 回答
0

伊万,只需阅读有关容量()的文档-它直接回答了您的问题...

于 2011-11-04T15:22:49.997 回答
0

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

但是当你的 String 的长度变得 >34 时,StringBuffer/StringBuilder 类的容量变得完全等于 String 的当前长度。

于 2017-07-10T12:29:37.450 回答
0

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

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

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

但在StringBuffer 的String 参数构造函数的情况下,容量计算如下所示

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

于 2020-02-02T07:26:20.837 回答