Java中的StringBuffer/StringBuilder大小

4

大家好,

为什么建议将StringBuffer/StringBuilder对象的大小初始化为2^{1...n}(尽管通常会> 64)。这样做可以获得什么优势/优化?


2
这个建议在哪里提出的? - Matt Ball
2个回答

7
建议是因为默认情况下,构造函数将使用 大小为16的 容量进行初始化,一旦超出容量,它就会 加倍 并创建一个新的数组。
因此,如果您确定要使用超过16个空间,应该使用更高的值进行初始化。

2
StringBuilder 源代码中并没有暗示 capacity 应该是 2 的幂。是的,当增长缓冲区时,每次都会将其加倍,但这并不意味着使用初始大小为 100 来初始化 StringBuilder 不是最优的选择。 - denis.solonenko
实际上,它的增长方式是 int newCapacity = (value.length + 1) * 2;,因此即使您从一个二次幂开始,它也不会保持为二次幂。 - clstrfsck
尽管我一直在使用StringBuilder\Buffer,但我从未关注过初始化时使用的默认值和容量加倍。@Oscar Gomez +1 - MalsR

3
这样做有什么优势/优化效果吗?
我认为这样做没有任何优势。
我的建议是选择一个稍微大一点的初始大小,略大于预期大小......如果你有一个相当好的估计。如果你没有估计,提供一个初始大小也不会带来太多好处。
使用显著超估的初始大小不是一个好主意。它浪费空间,JVM最终需要清零所有你不使用的字符,这将耗费CPU /内存周期。
[可以通过经验来确定低估和高估大小的成本,并与使用默认初始大小的成本进行比较。然而,这些数字可能取决于JIT优化器的好坏,以及内存复制速度与清零速度等因素。换句话说,它们将是特定平台的。]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接