Java StringBuilder中length()和capacity()方法之间的差异

Java StringBuilder中length()和capacity()方法之间的差异,java,stringbuilder,stringbuffer,Java,Stringbuilder,Stringbuffer,我试图弄清楚何时使用capacity()方法与StringBuilder或StringBuffer类的length()方法不同,或者为什么不同 我搜索了堆栈溢出并找到了答案,但我不理解它与length()方法的区别。我也访问过这个网站,但这对我的帮助更小。StringBuilder用于构建文本。在内部,它使用一个字符数组来保存添加到其中的文本容量是阵列的大小length是该数组中当前由应使用的文本填充的部分。因此: StringBuilder sb = new StringBuilder(100

我试图弄清楚何时使用
capacity()
方法与
StringBuilder
StringBuffer
类的
length()
方法不同,或者为什么不同


我搜索了堆栈溢出并找到了答案,但我不理解它与
length()
方法的区别。我也访问过这个网站,但这对我的帮助更小。

StringBuilder
用于构建文本。在内部,它使用一个字符数组来保存添加到其中的文本<代码>容量是阵列的大小
length
是该数组中当前由应使用的文本填充的部分。因此:

StringBuilder sb = new StringBuilder(1000);
sb.append("testing");
capacity()
为1000(在内部数组需要替换为更大的数组之前,可以容纳1000个字符,
length()
为7(数组中有七个有意义的字符)

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

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



*(无论是还是重要,都取决于代码在做什么)

字符串的长度始终小于或等于生成器的容量。长度是存储在生成器中的字符串的实际大小,容量是当前可以容纳的最大大小

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

由于您是Java新手,我还建议您使用以下关于StringBuilder效率的技巧:

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


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

length()
是指它当前有多少内容
cacacity()
是它当前有多少空间。先生(@tripleee)恕我直言,我想问一下您对我的答案所做的编辑(编辑很好),您将当前大小更改为最大大小?它可以增加,是不是现在是个不错的选择?我认为这是一个有用的澄清,但如果你不同意并已经改变了它,我完全同意。在我看来,“实际尺寸”和“当前尺寸”在这种情况下似乎是事实上的同义词。也许“目前可以容纳的最大尺寸”是一个合理的折衷方案?这种无缘无故的大胆可能也会让我感到厌烦。
StringBuilder sb = new StringBuilder();
sb.append("Singing:");
sb.append("I am the very model of a modern Major General");