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 ArrayLista une implémentation très similaire. Comme il ArrayListest 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 ArrayListtaille 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 ArrayListest à nouveau augmenté 25et 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 ArrayListconstructeur sans la taille appellera des ArrayList.add 1000000temps 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.addce 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 à 10et augmentant chaque redimensionnement à 50% + 1. C # commence à 4et augmente beaucoup plus agressivement, doublant à chaque redimensionnement. L' 1000000exemple ajoute ci-dessus pour C # utilise des 3097084opérations.
Références