【问题标题】:What is the capacity of a StringBuffer?StringBuffer 的容量是多少?
【发布时间】:2011-12-22 03:10:35
【问题描述】:

当我运行这段代码时:

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

它给出输出:

长度:17,容量:33

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

【问题讨论】:

    标签: java stringbuffer


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      公共整数容量()

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

      同样来自同一个文档

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          取自官方 J2SE 文档

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

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

          【讨论】:

            【解决方案5】:

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

            发件人:http://download.oracle.com/javase/1.4.2/docs/api/java/lang/StringBuffer.html

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                【解决方案7】:

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

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

                【讨论】:

                  【解决方案8】:

                  见:JavaSE 6 java.lang.StringBuffer capacity()

                  但你的假设是正确的:

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

                  【讨论】:

                    【解决方案9】:

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

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

                    【讨论】:

                      【解决方案10】:

                      Ivan,只需阅读 capacity() 的文档即可 - 它直接回答了您的问题...

                      【讨论】:

                      • 我已经把它变红了,上面写着“容量是存储量”,但我不确定这个量的度量单位是什么。正如一些人所认可的那样,这个度量单位是“字符数”。谢谢。
                      • 引用:返回当前容量。容量是可用于新插入字符的存储量,超过该容量将发生分配
                      【解决方案11】:

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

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

                      【讨论】:

                        【解决方案12】:

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

                        【讨论】:

                          【解决方案13】:

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

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

                          【讨论】:

                            【解决方案14】:

                            现在回答已经太晚了,但希望这可能对某人有所帮助。

                            当我们使用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

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2017-09-30
                              • 1970-01-01
                              • 2017-10-05
                              • 1970-01-01
                              • 2015-04-02
                              • 2019-01-20
                              相关资源
                              最近更新 更多