【问题标题】:Difference between length() and capacity() methods in StringBuilderStringBuilder 中 length() 和 capacity() 方法的区别
【发布时间】:2018-02-14 17:21:19
【问题描述】:

我试图弄清楚何时使用或为什么 capacity() 方法不同于 StringBuilderStringBuffer 类的 length() 方法。

我在 Stack Overflow 上进行了搜索,并设法提出了 this 答案,但我不明白它与 length() 方法的区别。我也访问过this 网站,但这对我的帮助更少。

【问题讨论】:

  • length() 是目前里面有多少东西。 cacacity() 是它目前有多少空间。

标签: java stringbuilder stringbuffer


【解决方案1】:

StringBuilder 用于构建文本。在内部,它使用一个字符数组来保存您添加到其中的文本。 capacity 是数组的大小。 length 是当前该数组中有多少被应该使用的文本填充。所以:

StringBuilder sb = new StringBuilder(1000);
sb.append("testing");

capacity() 是 1000(在内部数组需要替换为更大的字符之前有 1000 个字符的空间),length() 是 7(数组中有 7 个有意义的字符)。

容量很重要,因为如果您尝试向StringBuilder 添加比其容量更多的文本,它必须分配一个新的、更大的缓冲区并将内容复制到其中,这会影响内存使用和性能* .例如,StringBuilder 的默认容量当前为 16 个字符(未记录,可能会更改),因此:

StringBuilder sb = new StringBuilder();
sb.append("Singing:");
sb.append("I am the very model of a modern Major General");

...用char[16] 创建一个StringBuilder,将"Singing:" 复制到该数组中,然后必须创建一个new 数组并将内容复制到其中,然后才能添加第二个字符串,因为它没有足够的空间来添加第二个字符串。


* (是否重要取决于代码在做什么)

【讨论】:

    【解决方案2】:

    字符串的长度总是小于或等于builder的容量。长度是存储在构建器中的字符串的实际大小,容量是它当前可以容纳的最大大小

    如果添加更多字符以超出其容量,则构建器的容量会自动增加。在内部,字符串构建器是一个字符数组,因此构建器的容量就是数组的大小。如果超出了构建器的容量,则将阵列替换为新阵列。新的数组大小为2 * (the previous array size + 1)

    由于您是 Java 新手,因此我建议您在 StringBuilder 的效率方面也有以下提示:

    您可以使用newStringBuilder(initialCapacity) 创建具有指定初始容量的 StringBuilder。通过仔细选择初始容量,您可以使您的程序更有效率。如果容量总是大于构建器的实际长度,JVM 将永远不需要为构建器重新分配内存。另一方面,如果容量太大,就会浪费内存空间。您可以使用trimToSize() 方法将容量减小到实际大小。

    我试图用最好的术语来解释它,所以我希望它会有所帮助。

    【讨论】:

    • 先生(@tripleee) 恕我直言,我想问一下您对我的回答所做的编辑(编辑很好),您将 current size 更改为 最大尺寸?它可以增加不是所以 current 是个不错的选择吗?
    • 我认为这是一个有用的澄清,但如果你不同意并且已经改变它,我完全没问题。对我来说,“实际大小”和“当前大小”在这种情况下似乎是事实上的同义词。也许“它当前可以容纳的最大尺寸”是一个合理的折衷方案?有点无缘无故的粗体可能也会让我失望。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多