作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我已经对此进行了搜索,但我找不到为什么 StringBuilder 的 ensureCapacity()
方法不会通过仅加倍加二来延长旧容量。
所以,当默认容量 16 已满时,除非整个字符串长度不超过 34,否则下一个加长值将是 34。为什么不应该是 32?
我最好的猜测是考虑一个空字符'\u0000',但我不确定。谁能告诉我为什么?
最佳答案
我相信这与一种简单但有点愚蠢的方法有关,以确保非常小的字符串的角盒。
例如,如果我有字符串
""
我只是把它翻倍,我没有足够的大小来存放其他任何东西。如果我将它加倍并添加少量恒定的空格,我可以确保我的新值大于旧值。
那为什么要加二呢?可能是一个小的性能改进。通过添加两个而不是 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 中的读取,某些架构就无法适应非对齐读取,从而导致各种性能问题。
关于Java StringBuilder(StringBuffer) 的 ensureCapacity() : Why is it doubled and incremented by 2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45094521/
我是一名优秀的程序员,十分优秀!