J'ai en fait écrit un post de blog sur le sujet il y a 2 mois. L'article est pour le C#' List<T>
mais de Java ArrayList
a très semblable à la mise en œuvre. Depuis ArrayList
est mis en œuvre à l'aide d'un tableau dynamique, il augmente en taille sur demande. Donc, la raison de la capacité du constructeur est de l'optimisation.
Lorsque l'un de ces redimensionnements de fonctionnement se produit, la liste de tableaux, copie le contenu du tableau dans un nouveau tableau qui est le double de la capacité de l'ancien. Cette opération s'exécute en O(n) fois.
Exemple
Voici un exemple de la façon dont l' ArrayList
serait l'augmentation de la taille:
10
16
25
38
58
... 17 resizes ...
198578
297868
446803
670205
1005308
Si la liste commence avec une capacité de 10
, lors de la 11e élément est ajouté, il est en augmentation en 50% + 1
de 16
. Le 17 élément de l' ArrayList
est à nouveau augmentée de 25
et ainsi de suite. Considérons maintenant l'exemple où nous sommes en train de créer une liste où la capacité souhaitée est déjà connu comme 1000000
. La création de l' ArrayList
sans la taille constructeur appellera ArrayList.add
1000000
temps qui prend O(1) normalement ou O(n) sur redimensionner.
1000000 + 16 + 25 + ... + 670205 + 1005308 = 4015851 opérations
Comparez cela avec le constructeur, puis en appelant ArrayList.add
qui est garanti pour s'exécuter en O(1).
1000000 + 1000000 = 2000000 opérations
Java vs C#
Java est comme ci-dessus, en commençant à l' 10
et en augmentant chaque redimensionner à 50% + 1
. C# commence 4
et augmente de manière beaucoup plus agressive, en doublant à chaque redimensionnement. L' 1000000
ajoute de l'exemple ci-dessus pour C# utilise 3097084
des opérations.
Références