认识StringBuilder的Capacity自动增加方式

来源:互联网 发布:tcss.ping.js 编辑:程序博客网 时间:2024/06/05 10:18

现在知道动态组字符串要用StringBuilder,它的效能会比较好,但一般我们都是直接new出来用,很少去设定它的Capacity,那么StringBuilder它的预设Capacity是多少?而在我们使用的过程中,它是怎么自动增加?

  一般在我们直接New的情况下StringBuildersb=new StringBuilder(),它的预设Capacity是16,每次Append个长度为1的字符串,当我们加入的字符串长度超过16后,它就自动变大,它的Capacity就会变为32,之后就是64,128,256,512….的倍增方式.

Capacity : 16 Length : 0 [预设为16]

Capacity : 32 Length : 17 [第一次Append]

Capacity : 64 Length : 33 [第二次Append]

Capacity : 128 Length : 65 [第三次Append]

Capacity : 256 Length : 129 [第四次Append]

所以每次Length超过Capacity后,Capacity就会倍增.

  如果我们改变它的预设Capacity为20,Append的方式一样,那它的Capacity变化方式是什么,是为依照16,32,64,128的固定阶级原则增加,还是倍增?

Capacity : 20 Length : 0 [预设为16]

Capacity : 40 Length : 21 [第一次Append]

Capacity : 80 Length : 41 [第二次Append]

Capacity : 160 Length : 81 [第三次Append]

Capacity : 320 Length : 161 [第四次Append]

结论是它会依我们所设定的预设Capacity去倍增.

  这次换个角度去想,如果我们不是只Append长度为1的字符串,那么它的Capacity是怎么变的?所以这次改测试每次都Append一个长度为33的字符串.

Capacity : 16 Length : 0 [预设为16]

Capacity : 33 Length : 33 [第一次Append]

Capacity : 66 Length : 66 [第二次Append]

Capacity : 132 Length : 99 [第三次Append]

Capacity : 264 Length : 165 [第四次Append]

  从第一次到到四次Append都没什么问题,它都是倍增上去,但从预设到第一次Append,依照之前的实验结果,应该是16*2=32,因为字符串的Length是33超过倍增后的Capacity 32,所以Capacity会再倍增32*2=64,但测试结果Capacity却是33?这之中还有什么环节不同吗?

那么再换个Length为31来试看看.

Capacity : 16 Length : 0 [预设为16]

Capacity : 32 Length : 31 [第一次Append]

Capacity : 64 Length : 62 [第二次Append]

Capacity : 128 Length : 93 [第三次Append]

Capacity : 256 Length : 155 [第四次Append]

这次就没有问题了,是从16直接倍增上来.

  比较了一下这两个有什么差别?前一个测试Append的字符串长度为33一次跨了两阶,也就是16倍增后是32,但仍不够储存这个长度.所以就直接依实际字符串长度来设定Capacity,而第二个测试并没有跨两阶,再验证一下这个想法是否正确,如果第一次Append Length=31,第二次为34,会有什么不同.是否跨两阶就不会是倍增,而是直接依实际长度.

Capacity : 16 Length : 0 [预设为16]

Capacity : 32 Length : 31 [第一次Append]

Capacity : 65 Length : 65 [第二次Append]

看起来好像真的是如此

那改一下第二次Append的长度为3,那么应该就是64了.

Capacity : 16 Length : 0 [预设为16]

Capacity : 32 Length : 31 [第一次Append]

Capacity : 64 Length : 34 [第二次Append]

实验结果,果然是如此.

最后再看一下,如果是字符串长度跨两阶以上,是否也是一样的方式,所以第二次Append的长度为200.

Capacity : 16 Length : 0 [预设为16]

Capacity : 32 Length : 31 [第一次Append]

Capacity : 231 Length : 231 [第二次Append]

不失所望的,确实是依实际的字符串长度.

综合以上的测试结论 :

Capacity预设是 16

如果Append的字符串长度没有跨两阶,它会是以Capacity倍增的方式.

如果Append的字符串长度跨两阶以上,它会是以实际的Length来设定Capacity.

基本上是建议在知道将使用的Capacity量时,最好是设定Capacity,如果不知道,那就看取得将使用的Capacity量所付出的Cost是否值得,比如说,执行一些判断动作后,才知道要设多少Capacity,结果只有几百笔,那就大可少掉这个动作,我们已经知道Capacity自动长大的方式,异动的次数并不多.

希望这样的实验结果,能有助大家判断什么时候要设Capacity~

原创粉丝点击