je me demande l'utilité de la méthode void ensureCapacity(int)
sachnat que l'augmentation de capacité se fait automatiquement si on dépasse la capacité de tableau
je me demande l'utilité de la méthode void ensureCapacity(int)
sachnat que l'augmentation de capacité se fait automatiquement si on dépasse la capacité de tableau
ca permet de gagner en performance lors des gros ajouts. Imaginons que tu aie une liste de 15 éléments, et tu veux y faire entrer 5000 éléments supplémentaires, un à un (tu ne dispose pas d'une autre liste pour faire un addAll par exemple).
si tu laisse la liste grandir tout seul, le tableau interne va augmenter de taille d'un manière proche de la suivante
25, 50, 100, 200, 400, 800, 1600, 3200, 6400 (faut voir les détails des calculs dans la classe, mais c'est proche de ça)
ca veux dire que par 8 fois le tableau va être agrandit, alloué et copié. Si tu fais ça souvent, ce peux impliquer des pertes de performances. En pratique il est rare d'être dans un cas ou tu a besoin de gérer ça toi même, mais la méthode est disponible pour ces besoins spécifiques. Elle est aussi fortement utilisé en interne des classes poru agrandir le tableau![]()
merci pour votre réponse
je cherche algorithme de calcul de capacité pour un arraylist est que quelqu'un a une indication ?
Il suffit de regarder le code source de ArrayList. Code de sun:
C'est donc une augmentation par pas de 50%
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 /** * Increases the capacity of this <tt>ArrayList</tt> instance, if * necessary, to ensure that it can hold at least the number of elements * specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
Partager