我已经对此进行了搜索,但是我找不到为什么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中的读取,从而导致各种性能问题。