列表的默认容量是什么?
答案 0 :(得分:51)
你为什么不试试呢?
Console.WriteLine("Default capacity of a List: " + new List<int>().Capacity);
此答案适用于具有List的所有.NET版本。在我的版本中,它恰好是0。
答案 1 :(得分:42)
实际上,它从容量0开始。当您添加第一个元素时,当前实现分配容量为4.之后,如果需要扩展,容量将保持加倍,以保证摊销的O(1)操作。
请记住,这是当前的行为。你不应该依赖它。这应该证明当前的行为:
List<int> list = new List<int>();
int capacity = list.Capacity;
Console.WriteLine("Capacity: " + capacity);
for (int i = 0; i < 100000; i++)
{
list.Add(i);
if (list.Capacity > capacity)
{
capacity = list.Capacity;
Console.WriteLine("Capacity: " + capacity);
}
}
答案 2 :(得分:37)
根据MSDN parameterless constructor documentation上的示例,使用以下内容创建列表的初始容量:
List<string> x = new List<string>();
是0.据我所知,这不作为保证记录,也没有记录调整大小的策略(即它目前可以加倍至少4,但在.NET 5.0中,它可能会增加三倍至少128.)你不应该依赖这种行为。
答案 3 :(得分:4)
List的默认容量是4项(插入初始项后,否则为0)
var list = new List<int>();
list.Add(1);
Assert.AreEqual(4, list.Capacity);
答案 4 :(得分:2)
容量默认为0,但是如果您创建一个空白列表[ List1 ],如下所示。如果您创建的列表中的[ List2 ]中的元素如下所示,则添加的元素数将变为N超过2。默认容量有所不同。
List<int> List1 = new List<int>(); //count=0, capacity=0
List<int> List2 = new List<int>(){ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; //count=11, capacity=16
添加 Array 类型的元素时,开发人员使用 ReSize 方法扩展了数组。工作非常缓慢。在开发列表类型时,容量在一定程度上有所增加。此比率已发展为N大于2。
如果将更多成员添加到列表,则当前容量将增加一倍。 如果从列表中删除一些值,容量将不会减少。容量只会增加,不会减少。甚至清除方法也不会影响它。
答案 5 :(得分:1)
如果您大致知道要在List(或Stack或Queue)中存储的项目数,则应使用容量。
在这种情况下,您将避免内存复制。内存复制的发生是因为在引擎盖下Lists(Stacks和Queues)依赖于数组来存储它们的项目。该数组大小是您的容量,但它与列表大小不同。由于list的大小需要大于数组的大小,List实现将分配一个更大的数组(因子2可能更少),并将所有项目从旧数组复制到新数组加上新添加的项目。
因此,如果你知道你的列表中有50到60个项目,那么创建一个容量为60的列表,不会发生内存释放。
注意:看起来垃圾收集器不必清理旧数组
答案 6 :(得分:0)
这一切都在一行中,以确保容量能够存储另一个元素:
int num = this._items.Length == 0 ? 4 : this._items.Length * 2;
从mscorlib 4.0.0.0中解决这个问题 - 当然,正如Jon所说,这不能保证在将来不会改变(到目前为止它仍然保持在0,4,8,16 ......)。
当然,您可以自己设置,这样可以是3,9,27等。