Les avantages de tableaux
Comme je le vois, les avantages d'une liste sur un tableau sont assez évidentes:
- Génériques fournir plus précis tapant:
List<Integer>, List<? extends Number>, List<? super Integer>
. - Une Liste de l'interface a un tas méthodes utiles:
addAll
,remove
etc. Tandis que pour les tableaux de toutes les opérations standard à l'exception get/set doit être effectuée dans une procédure de manière en passant d'une méthode statique. - Collections proposent différentes implémentations comme
ArrayList
,LinkedList
, unmodifieable et la synchronisation des listes, ce qui peut être caché sous une Liste commune de l'interface. - OOB contrôle de la longueur.
Que des inconvénients, je ne peux que parler de l'absence de sucre syntaxique et à l'exécution, vérification de type. Dans le même temps, l'appui de deux structures nécessite souvent l'aide de asList
et toArray
méthodes, ce qui rend le code moins lisible. Donc, je suis curieux de savoir s'il y a des avantages importants de l'utilisation des tableaux que je m'ennuie.
InformationsquelleAutor Vitalii Fedorenko | 2010-05-16
Vous devez vous connecter pour publier un commentaire.
Tableaux sont plus efficaces, à la fois en termes de temps de traitement et la mémoire de l'empreinte. Ceci s'applique en particulier si vous êtes d'exploitation sur les types primitifs, tels que
int
oulong
, depuisList
exige de tous les éléments pour être enveloppé dans unObject
(commeInteger
ouLong
). Alors que le l'autoboxing fonctionnalités introduites par Java 5 réduit la quantité de code que vous avez besoin pour un tel emballage et de déballage, il ne supprime pas les problèmes de performances, comme wrapper objets sont encore en cours de création.Cependant, la plupart des applications n'ont probablement pas toutes les goulots d'étranglement des performances liées à ces problèmes, de sorte que dans la plupart des cas,
List
et d'autres collections devraient faire amende. Dans ces cas, la facilité de programmation l'emporte sur l'augmentation de la mémoire ou de l'utilisation de l'UC, etList
est le bon choix.Si votre liste ne change pas souvent, les Listes d'ajouter beaucoup de poids supplémentaire à l'objet que vous n'utilisez jamais. Lorsque vous essayez d'exécuter quelque chose qui doit être optimisé, ce qui est utile. Ce poids supplémentaire rend aussi les choses plus lentement qu'ils ne le seraient avec juste des tableaux. Toutefois, sauf si vous savez que vous avez besoin de gains de matrices de vous donner, vous devez juste être à l'aide de Listes.
Une chose que je n'ai pas vu mentionné ici: les tableaux peuvent avoir à N dimensions alors que les listes sont limités à un seul. Vous pouvez utiliser des listes de listes, mais la syntaxe (
List<List<...>>
) est beaucoup plus encombrant que le [][]Vitesse. Les Collections sont un peu plus lentes que de simples tableaux: en interne, plus encore utiliser des tableaux, mais ont des couches supplémentaires de code autour de ceux-ci. Bien sûr, sauf si vous avez un besoin spécifique pour plus de performances, vous devez toujours utiliser des collections.
Un autre petit avantage de tableaux, c'est qu'il pourrait être plus facile d'appeler variadic méthodes avec des tableaux. Cela ne devrait jamais être une raison principale pour en choisir un plus qu'un autre bien.
Constante de temps d'accès à tout élément avec une très faible constante. Pour accéder à un élément de tableau en toute sécurité et ne prend que quelques instructions: un couple de charges, à comparer, et une branche. La branche est généralement près de 100% du temps, donc du matériel moderne, fait un excellent travail de prédiction.
Je suppose que la réponse théorique est de ce tableau sont censés avoir de meilleures performances, car Générique collections ont des couches supplémentaires de l'abstraction. Personnellement, dans une application d'entreprise, je vois très peu de valeur à l'aide de Tableaux sur générique collections.
En plus pour les autres réponses, il y a une subtile propriété de tableaux qui peuvent être considérés comme un avantage sur les listes. Il peut être illustré par le code suivant:
Tout en un tableau d'une sous-classe EST un tableau de la super-classe, les listes de sous-classes ne sont PAS des listes de super-classes (et il y a une bonne raison à cela - les génériques aurait un type safery faille si c'était autorisé).
nums[0] = new Double(8.9)
et de dresser. Seulement au moment de l'exécution en serait-il de lever une exception.numList.add(new Double(8.9))
ne compile pas.List<? extends Number>
.Les tableaux sont mieux dans les situations suivantes:
Tableaux sont:
Collections semblable à la Matrice:
ArrayList
- vitesse de lecture et d'ajouter à la fin de laList
. Utilise en interne tableau. Lent si vous devez augmenter la taille de laList
LinkedList
- rapide ajouter aux deux côtés de laList
. Dynamique rapide taille augmenter/diminuer. Ne pas utiliser en interne de la matrice deConclusion:
Je vous recommande d'utiliser la fonction de votre scénario de Collecte. Ne lutte pas avec
Array []
parce que leCollections
offre très confortable API commeadd()
,addAll()
etc.De référence:
Vous pouvez trouver une comparaison plus détaillée ici -> Des "tableaux vs ArrayList vs LinkedList vs..."
Cela dépend vraiment de la situation. Les tableaux sont incroyablement rapides, mais ils sont d'une taille fixe et ils ne peuvent pas être approprié si la quantité de données que vous avez besoin de processus est très grand. Collections, d'autre part, ont des degrés variables de performances, selon la sous-classe donnée. La liste de tableaux, par exemple, est la plupart du temps juste un wrapper autour d'un tableau et donc devraient avoir le même itération de la vitesse et de mémoire. Pour moi, je l'utilise généralement l'objet iterable<T> interface dans la mesure du possible, depuis que donne le plus de souplesse pour mon code, permettant de traiter en-résident en mémoire des tableaux ainsi que des listes de données qui sont récupérées à partir d'un fichier ou sur un réseau en utilisant un custom itératif/classe iterator. Quand il est temps d'en instancier l'objet Itérable que je passe en, qui dépend de la situation spécifique; si je sais que la taille et s'adaptera en mémoire à la fois, puis-je simplement utiliser un tableau, alors que si il va peut-être pousser, alors je vais utiliser une ArrayList, et si elle a besoin rapide d'insertion à deux extrémités, puis je vais utiliser une LinkedList.