StringBuilder中的length()和capacity()方法之间的区别

问题描述:

我试图弄清楚何时使用或为什么capacity()方法不同于length()方法的StringBuilderStringBuffer类。StringBuilder中的length()和capacity()方法之间的区别

我已经搜索堆栈溢出,并设法拿出this的答案,但我不明白它与length()方法的区别。我也访问过this网站,但这对我来说帮助更少。

+0

'length()'是当前有多少东西在里面。 'cacacity()'是它目前有多少空间。 – khelwood

StringBuilder是建立文本。在内部,它使用一组字符来存放您添加到其中的文本。 capacity是数组的大小。 length是该数组中多少数据当前由应该使用的文本填充。因此,与:

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

capacity()是1000(有空间用于1000个字符需要用较大的一个被替换的内部阵列之前),和length()是7(有阵列在七个有意义字符)。

的能力是非常重要的,因为如果你尝试更多的文本添加到StringBuilder比它有能力,它分配一个新的,更大的缓存和复制内容到它,它有内存使用和性能的影响*。例如,StringBuilder的默认容量是目前16个字符(它不记录,并可以改变),所以:

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

...创建StringBuilder与​​,副本"Singing:"成数组,那么必须创建一个新的数组,并在它添加第二个字符串之前将内容复制到它,因为它没有足够的空间来添加第二个字符串。


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

字符串的长度总是小于或等于制造商的能力。长度为构建器中存储的字符串的实际大小,容量为最大大小,它目前可以适用。

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

既然你是新的Java的,我建议你这个技巧也有关的StringBuilder的效率:

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

我试图解释一下我能做到的最好的条件,所以我希望它有帮助。

+0

Thanks @ mandy8055此答案也有帮助 – NiruADV

+0

Sir(@tripleee)有充分的尊重,我想问一下你对我的回答所做的修改(编辑是好的),你把**当前的大小**改为**最大尺寸**?它可以增加是不是所以**目前**是不错的选择? – Mandy8055

+0

我认为这是一个有用的说明,但如果你不同意并已经改变它,那对我来说完全没问题。对我而言,“实际尺寸”和“当前尺寸”在这种情况下似乎是事实上的同义词。也许“目前适合的最大尺寸”将是一个合理的妥协?有些无端的粗暴表情也可能会让我失望。 – tripleee