Bien que les réponses proposant d'utiliser ArrayList aient un sens dans la plupart des scénarios, la question réelle des performances relatives n'a pas vraiment été résolue.
Il y a quelques choses que vous pouvez faire avec un tableau:
- le créer
- définir un élément
- obtenir un article
- cloner / copier
Conclusion générale
Bien que les opérations get et set soient un peu plus lentes sur une ArrayList (resp. 1 et 3 nanosecondes par appel sur ma machine), il y a très peu de temps supplémentaire pour utiliser une ArrayList par rapport à une baie pour toute utilisation non intensive. Il y a cependant quelques points à garder à l'esprit:
- le redimensionnement des opérations sur une liste (lors de l'appel
list.add(...)
) est coûteux et il convient d'essayer de définir la capacité initiale à un niveau adéquat lorsque cela est possible (notez que le même problème se pose lors de l'utilisation d'un tableau)
- lorsqu'il s'agit de primitives, les tableaux peuvent être beaucoup plus rapides car ils permettent d'éviter de nombreuses conversions boxing / unboxing
- une application qui obtient / définit uniquement des valeurs dans une ArrayList (pas très courant!) pourrait voir un gain de performances de plus de 25% en passant à un tableau
Résultats détaillés
Voici les résultats que j'ai mesurés pour ces trois opérations en utilisant la bibliothèque d'analyse comparative jmh (temps en nanosecondes) avec JDK 7 sur une machine de bureau x86 standard. Notez que ArrayList n'est jamais redimensionné dans les tests pour s'assurer que les résultats sont comparables. Code de référence disponible ici .
Création de tableaux / tableaux
J'ai exécuté 4 tests, exécutant les instructions suivantes:
- createArray1:
Integer[] array = new Integer[1];
- createList1:
List<Integer> list = new ArrayList<> (1);
- createArray10000:
Integer[] array = new Integer[10000];
- createList10000:
List<Integer> list = new ArrayList<> (10000);
Résultats (en nanosecondes par appel, confiance à 95%):
a.p.g.a.ArrayVsList.CreateArray1 [10.933, 11.097]
a.p.g.a.ArrayVsList.CreateList1 [10.799, 11.046]
a.p.g.a.ArrayVsList.CreateArray10000 [394.899, 404.034]
a.p.g.a.ArrayVsList.CreateList10000 [396.706, 401.266]
Conclusion: pas de différence notable .
obtenir des opérations
J'ai exécuté 2 tests, exécutant les instructions suivantes:
- getList:
return list.get(0);
- getArray:
return array[0];
Résultats (en nanosecondes par appel, confiance à 95%):
a.p.g.a.ArrayVsList.getArray [2.958, 2.984]
a.p.g.a.ArrayVsList.getList [3.841, 3.874]
Conclusion: obtenir à partir d'un tableau est environ 25% plus rapide que d'obtenir à partir d'une ArrayList, bien que la différence ne soit que de l'ordre de la nanoseconde.
définir les opérations
J'ai exécuté 2 tests, exécutant les instructions suivantes:
- setList:
list.set(0, value);
- setArray:
array[0] = value;
Résultats (en nanosecondes par appel):
a.p.g.a.ArrayVsList.setArray [4.201, 4.236]
a.p.g.a.ArrayVsList.setList [6.783, 6.877]
Conclusion: les opérations de définition sur les tableaux sont environ 40% plus rapides que sur les listes, mais, comme pour get, chaque opération de définition prend quelques nanosecondes - pour que la différence atteigne 1 seconde, il faudrait définir des éléments dans la liste / le tableau des centaines des millions de fois!
cloner / copier
Les délégués constructeur de copie de ArrayList à Arrays.copyOf
si le rendement est identique à la copie de matrice (copie d' une matrice via clone
, Arrays.copyOf
ou ne System.arrayCopy
fait aucune différence en terme de performance matériel ).