Phi*_*aek 26 java stringbuilder stringbuffer capacity
我已经搜索了这个,但是我找不到为什么StringBuilder的ensureCapacity()方法不会通过加倍来延长旧容量,而是添加两个.
因此,当默认容量16已满时,下一个加长值将为34,除非整个字符串长度不超过34.为什么不应该是32?
我最好的猜测是考虑一个空字符'\ u0000',但我不确定.谁能告诉我为什么?
我相信它与一个简单的,有点愚蠢的方式有关,以确保非常小的字符串的角落情况.
例如,如果我有字符串
""
Run Code Online (Sandbox Code Playgroud)
而我只加倍,我没有足够的尺寸来存储其他任何东西.如果我将它加倍并添加一个小的恒定数量的空格,我可以确保我的新值大于我的旧值.
为什么要增加两个呢?可能是一个小的性能改进.通过添加两个而不是1,我可以避免小扩展的中间扩展(下面详细介绍0到10个字符)
"" => expand => "1" => expand => "123" expand => "1234567" expand => "123456789012345"
Run Code Online (Sandbox Code Playgroud)
与...相比,这是4个扩展
"" => expand => "12" => expand => "123456" => expand => "123456789012"
Run Code Online (Sandbox Code Playgroud)
这是3扩展.对于一个char字符串(扩展到10个字符)也很好用
"1" => expand => "1234" => expand => "1234567890"
Run Code Online (Sandbox Code Playgroud)
而1 char扩展例程看起来像
"1" => expand => "123" => expand => "1234567" => expand => "123456789012345"
Run Code Online (Sandbox Code Playgroud)
最后,增加的两个增量趋向于在大约50%的时间内对齐,而增加的一个或三个增量将在大约25%的时间内这样做.虽然这可能看起来不是什么大问题,但是如果没有昂贵的中断调用来重写CPU中的读取,某些架构无法容纳非对齐读取,从而导致各种性能问题.