71 votes

Capacité par défaut de la liste

Quelle est la capacité par défaut d'une liste?

72voto

Thorarin Points 21538

En fait, il commence par une capacité de 0. Lorsque vous ajoutez le premier élément, l'implémentation actuelle alloue une capacité de 4. Après cela, la capacité continue de doubler si une expansion est nécessaire, pour garantir le fonctionnement amorti de O (1).

Gardez à l'esprit qu'il s'agit du comportement actuel. Vous ne devriez pas vous en remettre à cela. Cela devrait démontrer le comportement actuel:

 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);
    }
}
 

64voto

Mark Byers Points 318575

Pourquoi ne l'essayez-vous pas?

 Console.WriteLine("Default capacity of a List: " + new List<int>().Capacity);
 

Cette réponse fonctionnera sur toutes les versions de .NET qui ont List. Sur ma version, il se trouve que c'est 0.

52voto

Jon Skeet Points 692016

Selon l'exemple de la documentation du constructeur sans paramètre MSDN , la capacité initiale d'une liste créée avec:

 List<string> x = new List<string>();
 

est 0. Pour autant que je sache, cela n'est pas documenté comme une garantie, ni la politique de redimensionnement documentée (c'est-à-dire qu'elle peut actuellement doubler avec un minimum de 4, mais dans .NET 5.0, elle pourrait tripler avec un minimum de 128 .) Fondamentalement, vous ne devriez pas vous fier à ce comportement.

7voto

Elisha Points 11999

La capacité par défaut de List est de 4 éléments (après avoir inséré un élément initial, sinon il est de taille 0)

 var list = new List<int>();
list.Add(1);

Assert.AreEqual(4, list.Capacity);
 

0voto

tomkuj Points 41

Tout cela réside dans une seule ligne pour garantir que la capacité est capable de stocker un autre élément:

 int num = this._items.Length == 0 ? 4 : this._items.Length * 2;
 

J'ai obtenu cela du mscorlib 4.0.0.0 désassemblé - bien sûr, comme Jon l'a dit, cela ne peut être garanti de ne pas changer à l'avenir (jusqu'à présent, il reste à 0, 4, 8, 16 ...).

Bien sûr, vous pouvez le régler vous-même, ce qui peut être 3, 9, 27, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X