我已经对此进行了搜索,但是我找不到为什么StringBuilder的ensureCapacity()方法不会通过仅加倍又加两个来延长旧容量。

因此,当默认容量为16时,除非整个字符串长度不超过34,否则下一个加长的值将为34。为什么不应该为32?

我最好的猜测是考虑使用空字符'\u0000',但我不确定。谁能告诉我为什么?

最佳答案

我相信这与一种简单的方法有关,以确保很小的弦的极端情况。

例如,如果我有字符串

""

而且我只能将其加倍,我将没有足够的大小来存储其他内容。如果我将其加倍并添加少量恒定的空格,则可以确保我的新值大于旧值。

那为什么要加二呢?可能会有很小的性能改进。通过加2而不是1,我可以避免小扩展(中间有0到10个字符)的中间扩展
"" => expand => "1" => expand => "123" expand => "1234567" expand => "123456789012345"

与4相比
"" => expand => "12" => expand => "123456" => expand => "123456789012"

这是3展开。这对于一个字符字符串也很有效(扩展到10个字符)
"1" => expand => "1234" => expand => "1234567890"

而1个char扩展例程看起来像
"1" => expand => "123" => expand => "1234567" => expand => "123456789012345"

最后,增加的2会使单词对齐大约占时间的50%,而增加的1或3则会使单词对齐大约占25%的时间。尽管这似乎没什么大不了,但是某些体系结构无法容纳不对齐的读取,而没有昂贵的中断调用来重写CPU中的读取,从而导致各种性能问题。

09-04 05:00
查看更多