我知道当sb已经处于容量状态时,当你使用sb.Append(..)时,StringBuilder对象会分配更多的内存。但是这个容量增加了多少?
StringBuilder sb = new StringBuilder(5);
sb.Append("0123456789");
现在sb的容量是什么?为什么?乘数是多少?
为了清楚起见。我问的是容量而不是长度。
谢谢!
答案 0 :(得分:8)
除了一些特殊情况之外,每次容量增加一倍:
您可以使用.NET Reflector或下载参考源来查看算法。
我无法发布官方.NET实现的源代码,但这里是Mono实现的代码:
// Try double buffer, if that doesn't work, set the length as capacity
if (size > capacity) {
// The first time a string is appended, we just set _cached_str
// and _str to it. This allows us to do some optimizations.
// Below, we take this into account.
if ((object) _cached_str == (object) _str && capacity < constDefaultCapacity)
capacity = constDefaultCapacity;
capacity = capacity << 1; // This means "capacity *= 2;"
if (size > capacity)
capacity = size;
if (capacity >= Int32.MaxValue || capacity < 0)
capacity = Int32.MaxValue;
if (capacity > _maxCapacity && size <= _maxCapacity)
capacity = _maxCapacity;
}
我还建议你不要编写依赖于这个特定算法的代码,因为它是一个实现细节,而不是接口保证的东西。
答案 1 :(得分:0)
它是指数增长(具体来说,每次重新分配加倍),以便允许一系列追加采用O(N)时间而不是O(N²)时间。