J'ai en fait écrit un article de blog sur le sujet il y a 2 mois. L'article est pour C # List<T>
mais Java ArrayList
a une implémentation très similaire. Comme il ArrayList
est implémenté à l'aide d'un tableau dynamique, sa taille augmente à la demande. Donc, la raison du constructeur de capacité est à des fins d'optimisation.
Lorsqu'une de ces opérations de redimensionnement se produit, ArrayList copie le contenu du tableau dans un nouveau tableau qui est deux fois la capacité de l'ancien. Cette opération s'exécute en temps O (n) .
Exemple
Voici un exemple de la façon dont la ArrayList
taille augmenterait:
10
16
25
38
58
... 17 resizes ...
198578
297868
446803
670205
1005308
Ainsi, la liste commence avec une capacité de 10
, lorsque le 11e élément est ajouté, il est augmenté de 50% + 1
à 16
. Sur le 17e élément, le ArrayList
est à nouveau augmenté 25
et ainsi de suite. Prenons maintenant l'exemple où nous créons une liste dans laquelle la capacité souhaitée est déjà connue sous le nom de 1000000
. La création du ArrayList
constructeur sans la taille appellera des ArrayList.add
1000000
temps qui prennent O (1) normalement ou O (n) lors du redimensionnement.
1000000 + 16 + 25 + ... + 670205 + 1005308 = 4015851 opérations
Comparez cela en utilisant le constructeur, puis en appelant ArrayList.add
ce qui est garanti pour s'exécuter dans O (1) .
1000000 + 1000000 = 2000000 opérations
Java contre C #
Java est comme ci-dessus, commençant à 10
et augmentant chaque redimensionnement à 50% + 1
. C # commence à 4
et augmente beaucoup plus agressivement, doublant à chaque redimensionnement. L' 1000000
exemple ajoute ci-dessus pour C # utilise des 3097084
opérations.
Références