gpt4 book ai didi

Java StringBuilder(StringBuffer) 的 ensureCapacity() : Why is it doubled and incremented by 2?

转载 作者:IT老高 更新时间:2023-10-28 21:20:08 26 4
gpt4 key购买 nike

我已经对此进行了搜索,但我找不到为什么 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com