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

Difference between length() and capacity() methods in StringBuilder

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

我在 Stack Overflow 上进行了搜索,并设法找到了 this answer, but I didn't understand its distinction with length() method. I have visited this 网站,但这对我的帮助更小。

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 * (the previous array size + 1).

由于您是 Java 的新手,我会向您推荐关于 StringBuilder 效率的提示:

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

我已尽我所能对其进行解释,希望对您有所帮助。