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

5

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

我在 Stack Overflow 上进行了搜索并找到了这个答案,但我没有理解它与length()方法的区别。我还访问了这个网站,但这对我帮助更少。


length()代表当前容器中的元素数量,而capacity()代表它目前所拥有的空间大小。 - khelwood
2个回答

9

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");

该代码使用一个 char[16] 创建了一个 StringBuilder,将 "Singing:" 复制到这个数组中。为了添加第二个字符串,它需要创建一个新的数组,并将内容复制到其中,因为它没有足够的空间来添加第二个字符串。


* (这两者是否都重要取决于代码正在执行什么操作)


3
字符串的长度始终小于或等于构建器的容量。长度是存储在构建器中的字符串的实际大小,而容量是它当前可以适应的最大大小。
如果添加更多字符以超过其容量,则构建器的容量会自动增加。在内部,字符串构建器是一个字符数组,因此构建器的容量是数组的大小。如果超出了构建器的容量,则该数组将被替换为新数组。新数组的大小是前一个数组大小加1的两倍。
由于你是Java的新手,我还建议你关注StringBuilder的效率:
你可以使用newStringBuilder(initialCapacity)来创建具有指定初始容量的StringBuilder。通过仔细选择初始容量,您可以使程序更加高效。如果容量始终大于构建器的实际长度,JVM将永远不需要为构建器重新分配内存。另一方面,如果容量太大,将浪费内存空间。您可以使用trimToSize()方法将容量减少到实际大小。
我尽力用最好的方式解释了它,希望对你有所帮助。

尊敬的@tripleee先生,我想请教您对我的回答所做的修改(修改很好),您将“current size”更改为“maximum size”,这样做有必要吗?因为它可以增加,所以“current”是一个不错的选项。 - user7571182
我认为这是一个有用的澄清,但如果你不同意并且已经改变了,那对我来说完全没问题。在我看来,“实际大小”和“当前大小”在这个上下文中似乎是事实上的同义词。也许“它目前可以适应的最大尺寸”会是一个合理的妥协吧?这个有点过分强调的加粗可能也让我感到困惑。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接