当我运行此代码时:
StringBuffer name = new StringBuffer("stackoverflow.com");
System.out.println("Length: " + name.length() + ", capacity: " + name.capacity());
它给出输出:
长度:17,容量:33
明显的长度与字符串中的字符数有关,但我不确定容量是多少?StringBuffer 在重新分配空间之前可以容纳的字符数是多少?
当我运行此代码时:
StringBuffer name = new StringBuffer("stackoverflow.com");
System.out.println("Length: " + name.length() + ", capacity: " + name.capacity());
它给出输出:
长度:17,容量:33
明显的长度与字符串中的字符数有关,但我不确定容量是多少?StringBuffer 在重新分配空间之前可以容纳的字符数是多少?
它是内部缓冲区的大小。正如Javadoc所说:
每个字符串缓冲区都有一个容量。只要字符串缓冲区包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲区数组。如果内部缓冲区溢出,它会自动变大。
是的,您是对的,请参阅JavaDoc了解更多信息:
只要字符串缓冲区包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲区数组。如果内部缓冲区溢出,它会自动变大。
内部StringBuffer
使用char
数组来存储字符。容量是该char
数组的初始大小。
更多信息可以从http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html找到
来自http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html#capacity%28%29
公共 int 容量()
返回当前容量。容量是可用于新插入字符的存储量,超出该容量将发生分配。
也来自同一个文档
从 JDK 5 开始,该类已经补充了一个为单线程使用而设计的等效类 StringBuilder。通常应优先使用 StringBuilder 类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。
取自官方 J2SE 文档
容量是可用于新插入字符的存储量,超出该容量将发生分配。
它一般是length+16,是最小分配,但是一旦字符的个数,即它的大小超过分配的一个,StringBuffer也会增加它的大小(按固定数量),但是分配多少数量,我们不能计算它。
是的,就是这样。你可以认为在这方面StringBuffer
有点像 a Vector<char>
(除非很明显你不能char
在 Java 中用作类型参数......)
每个字符串缓冲区都有一个容量。只要字符串缓冲区包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲区数组。如果内部缓冲区溢出,它会自动变大。
来自:http: //download.oracle.com/javase/1.4.2/docs/api/java/lang/StringBuffer.html
StringBuffer 有一个 char[] 在其中保存您附加到它的字符串。当前分配给该缓冲区的内存量就是容量。当前使用的量是长度。
"每个字符串缓冲区都有一个容量,只要字符串缓冲区包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲区数组。如果内部缓冲区溢出,则自动进行更大。”
http://download.oracle.com/javase/1.3/docs/api/java/lang/StringBuffer.html - 查看容量()和确保容量()
容量是新插入字符可用的存储量。它与length()不同。length()返回字符总数,如果字符数小于16,容量默认返回16。但是如果数字字符数大于 16 容量是字符数 + 16。在这种情况下,字符数=17 SO,容量=17+16=33
伊万,只需阅读有关容量()的文档-它直接回答了您的问题...
StringBuffer/StringBuilder 类的初始容量为 16。如果您的 String 的长度变为 >16,这是第一次。StringBuffer/StringBuilder类的容量增加到34即[(16*2)+2]
但是当你的 String 的长度变得 >34 时,StringBuffer/StringBuilder 类的容量变得完全等于 String 的当前长度。
答案已经为时已晚,但希望这可能对某人有所帮助。
当我们使用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