Under the hood Lists (Stacks and Queues) rely on array to store their items. Whenever we create a empty list the default capacity of the list will be 0. At this time the underline array will be empty. In the code below we are creating an empty list and then we are writing its capacity in console.
List<int> number = new List<int>();
Console.WriteLine(number.Capacity);
The code returns 0. Now lets add an item to the list.
List<int> number = new List<int>();
number.Add(10);
Console.WriteLine(number.Capacity);
Console.ReadLine();
If we run this code it shows 4 as capacity, but we added only 1 item then why we are getting 4 as capacity?
Actually, it starts with a Capacity of 0. When you add the first element, the current implementation allocates a capacity of 4. After that, the capacity keeps doubling if expansion is needed, to guarantee amortized O(1) operation. Code below should demonstrate the current behavior
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);
}
}
Console.ReadLine();
In simpler words whenever we add first element in the list, framework creates an array of size 4 and use it to store list’s elements. As soon as we add 5th element in the list framework create another array of size 8, copy all 4 list elements from the old array to new array and then add new element to the new array. Now when we add 9th element framework creates and new array of size 16 and copy elements from older array to new array and add newly added element. This creation of new array and copying of older elements keep repeating whenever we reach the size of underline array. All this operation require time and operation and hits performance. It is a good idea to initialize a list with required capacity in advance, if we know how many Items we need to store in a list . So, if you know that you may have from, say, 50 to 60 items in your list, create a list with capacity 60 and no memory deallocation will happen and Garbage Collector will not have to clean up old arrays.
Comments
Post a Comment