C#Arraylist中的容量属性

时间:2018-04-18 04:32:35

标签: c#

我在C#中浏览了Arraylist的属性。我做的是:

ArrayList listInt = new ArrayList();
listInt.Add(9);
listInt.Add(10);
listInt.Add(11);
Console.WriteLine($"Capacity Before: {listInt.Capacity}");

输出为4,很好。 接下来我尝试了AddRange()属性:

ArrayList list2 = new ArrayList();
list2.Add("SAM");
list2.Add("MAN");
list2.Add("TAN");
listInt.AddRange(list2);
Console.WriteLine($"Capacity After: {listInt.Capacity}");

输出为8。

输出

a

我的ArrayList的容量如何变为8?

1 个答案:

答案 0 :(得分:7)

因为您在列表中添加了3个元素...

Capacity是内部数组的大小...它从0开始,然后在第一次添加时默认为4。当它需要更多容量时,它会上升2倍。这样可以将内存复制保持在最低限度(以一小部分内存为代价)。

注意:不要将CapacityCount混淆,但它们是不同的东西

您向阵列添加3个元素

ArrayList listInt = new ArrayList(); // capacity = 0 
listInt.Add(9);                      // capacity = 4
listInt.Add(10);                     // capacity = 4
listInt.Add(11);                     // capacity = 4

因此,当您将第一个元素添加到列表中时,内部Add会调用EnsureCapacity。看起来像这样(Full Source Here

private const int _defaultCapacity = 4;

...
private void EnsureCapacity(int min)
{
   if (_items.Length < min)
   {
      int newCapacity = _items.Length == 0 ? _defaultCapacity : _items.Length * 2;
      ...
   }
}

记下_items.Length * 2 ...

listInt.AddRange(list2);             // capacity = 8

您的列表中可能只有3个元素,但容量为4.现在您添加了3个元素,它没有其他选择,然后将容量乘以2

List.Capacity Property

  

获取或设置内部数据结构的元素总数   可以在不调整大小的情况下持有。

List.Count Property

  

获取List中包含的元素数。