Bien que les réponses qui propose d'utiliser ArrayList n'a de sens que dans la plupart scénario, la question réelle de la performance relative n'a pas vraiment eu de réponse.
Il ya quelques choses que vous pouvez faire avec un tableau:
- créer
- définir un élément
- un élément
- clone/copier
Conclusion générale
Bien que les opérations get et set sont un peu plus lent sur une liste de tableaux (resp. 1 et 3, l'ordre de la nanoseconde par appel sur ma machine), il y a très peu de frais généraux de l'utilisation d'une liste de tableaux vs un tableau pour tout usage non intensif. Il y a cependant quelques petites choses à garder à l'esprit:
- les opérations de redimensionnement sur une liste (lors de l'appel d'
list.add(...)
) sont coûteux et que l'on devrait essayer de définir la capacité initiale à un niveau adéquat lorsque c'est possible (à noter que le même problème se pose lors de l'utilisation d'un tableau)
- lorsque vous traitez avec les primitives, les tableaux peuvent être beaucoup plus rapides car ils permettent d'éviter de nombreux boxing/unboxing conversions
- une demande à laquelle il n'obtient ou définit des valeurs dans une liste de tableaux (pas très commun!!!) pourrait voir un gain de performance de plus de 25% en passant à un tableau
Les résultats détaillés
Voici les résultats que j'ai mesuré pour ces trois opérations à l'aide de la jmh l'analyse comparative de la bibliothèque de fois (en nanosecondes) avec JDK 7 sur un x86 standard machine de bureau. Notez que la liste de tableaux ne sont jamais redimensionnées dans les tests afin de vérifier que les résultats sont comparables. Référence code disponible ici.
Tableau/Liste De Tableaux De La Création
J'ai couru 4 tests, d'exécuter les commandes 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, de 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: aucune différence notable.
obtenez des opérations
J'ai couru 2 tests, d'exécuter les commandes suivantes:
- getList:
return list.get(0);
- getArray:
return array[0];
Résultats (en nanosecondes par appel, de confiance à 95%):
a.p.g.a.ArrayVsList.getArray [2.958, 2.984]
a.p.g.a.ArrayVsList.getList [3.841, 3.874]
Conclusion: arriver à partir d'un tableau est d'environ 25% plus rapide que d'obtenir à partir d'une liste de tableaux, bien que la différence n'est que de l'ordre de l'ordre de la nanoseconde.
ensemble des opérations
J'ai couru 2 tests, d'exécuter les commandes 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: définir les opérations sur les tableaux sont environ 40% plus rapide que sur les listes, mais que, pour l'obtenir, chaque ensemble de l'opération ne prend que quelques nanosecondes - donc pour la différence pour atteindre 1 seconde, il serait nécessaire de définir les éléments de la liste/tableau des centaines de millions de fois!
clone/copie
Liste de tableaux du constructeur de copie délégués Arrays.copyOf
le rendement est identique à la matrice de copie (copie d'un tableau via clone
, Arrays.copyOf
ou System.arrayCopy
fait pas de différence en terme de performance).