List 的默认容量是多少?
List 的默认容量是多少?
实际上,它从容量为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);
}
}
2n
个项目(包括过去的分配)分配空间-因此,由于这是针对n
个.Add
的,每个.Add
大约需要2
个任意时间单位,也就是平摊的O(1)
时间。(当然,这假设分配需要线性时间) - somebody你为什么不试一下呢?
Console.WriteLine("Default capacity of a List: " + new List<int>().Capacity);
这个答案适用于所有具有List的.NET版本。在我的版本上,它恰好是0。
根据MSDN无参数构造函数文档中的示例,使用以下代码创建的列表的初始容量为:
List<string> x = new List<string>();
我发现初始容量为0的情况并没有文档保证,而且也没有说明resize策略(即可能当前是每次double,最小值为4,但在.NET 5.0中,它可能会变成triple,最小值为128)。基本上你不应该依赖这种行为。
Capacity
属性,它都是从0开始的。 - ThorarinList的默认容量为4个项目(在插入初始项目之后,否则为0大小)
var list = new List<int>();
list.Add(1);
Assert.AreEqual(4, list.Capacity);
默认容量为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
如果您大致知道要在List(或Stack、Queue)中存储多少项,则应使用容量。在这种情况下,您将避免内存复制。内存复制是因为底层的Lists(Stacks和Queues)依赖于数组来存储它们的项目。该数组大小是您的容量,但它与列表大小不同。由于列表的大小需要大于数组的大小,因此List实现将分配一个更大的数组(可能少2倍),并将所有项目从旧数组复制到新数组以及新增的项目。
因此,如果您知道您的列表中可能有50到60个项目,请创建一个容量为60的列表,就不会发生内存释放。
注意:看起来垃圾收集器将不必清理旧数组。
List<string> dinosaurs = new List<string>();
Console.WriteLine("\nInit:\nCapacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);
dinosaurs.Add("Deinonychus");
Console.WriteLine();
foreach (string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);
dinosaurs.Add("Mamenchisaurus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Compsognathus");
dinosaurs.Add("Son of Compsognathus");
Console.WriteLine();
foreach (string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);
/* In C# 11 This code example produces the following output:
Init:
Capacity: 0
Count: 0
Deinonychus
Capacity: 4
Count: 1
Deinonychus
Mamenchisaurus
Amargasaurus
Compsognathus
Son of Compsognathus
Capacity: 8
Count: 5
==>> default: 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等。