Structures de données .NET:
En savoir plus sur les raisons pour lesquelles ArrayList et List sont réellement différents
Tableaux
Comme le dit un utilisateur, les tableaux sont la collection «old school» (oui, les tableaux sont considérés comme une collection bien qu'ils ne fassent pas partie de System.Collections
). Mais, qu'est-ce que la «vieille école» sur les tableaux par rapport à d'autres collections, c'est-à-dire celles que vous avez répertoriées dans votre titre (ici, ArrayList et List (Of T))? Commençons par les bases en examinant les tableaux.
Pour commencer, les tableaux dans Microsoft .NET sont des «mécanismes qui vous permettent de traiter plusieurs éléments [liés logiquement] comme une seule collection» (voir l'article lié). Qu'est-ce que ça veut dire? Les tableaux stockent les membres individuels (éléments) séquentiellement, l'un après l'autre en mémoire avec une adresse de départ. En utilisant le tableau, nous pouvons facilement accéder aux éléments stockés séquentiellement en commençant à cette adresse.
Au-delà de cela et contrairement à la programmation de 101 conceptions courantes, les tableaux peuvent vraiment être assez complexes:
Les tableaux peuvent être monodimensionnels, multidimensionnels ou jaddés (les tableaux dentelés valent la peine d'être lus). Les tableaux eux-mêmes ne sont pas dynamiques: une fois initialisé, un tableau de taille n réserve suffisamment d'espace pour contenir n nombre d'objets. Le nombre d'éléments dans le tableau ne peut pas augmenter ou diminuer. Dim _array As Int32() = New Int32(100)
réserve suffisamment d'espace sur le bloc de mémoire pour que le tableau contienne 100 objets de type primitif Int32 (dans ce cas, le tableau est initialisé pour contenir 0). L'adresse de ce bloc est retournée à _array
.
Selon l'article, Common Language Specification (CLS) requiert que tous les tableaux soient basés sur zéro. Les tableaux en .NET prennent en charge les tableaux non basés sur zéro; cependant, c'est moins courant. En raison de la «banalité» des baies à base zéro, Microsoft a passé beaucoup de temps à optimiser leurs performances ; par conséquent, les tableaux à base zéro (SZ) à une dimension sont "spéciaux" - et vraiment la meilleure implémentation d'un tableau (par opposition à multidimensionnel, etc.) - parce que les SZ ont des instructions de langage intermédiaire spécifiques pour les manipuler.
Les tableaux sont toujours transmis par référence (en tant qu'adresse mémoire) - une pièce importante du puzzle de tableau à savoir. Bien qu'ils vérifient les limites (génèrent une erreur), la vérification des limites peut également être désactivée sur les tableaux.
Encore une fois, le plus grand obstacle aux tableaux est qu'ils ne sont pas redimensionnables. Ils ont une capacité "fixe". Présentation de ArrayList et List (Of T) à notre histoire:
ArrayList - liste non générique
L' ArrayList (ainsi que List(Of T)
- bien qu'il existe quelques différences critiques, ici, expliquées plus loin) - est peut-être mieux considéré comme le prochain ajout aux collections (au sens large). ArrayList hérite de l' interface IList (un descendant de 'ICollection'). Les listes de tableaux elles-mêmes sont plus volumineuses - nécessitant plus de frais généraux - que les listes.
IList
permet à l'implémentation de traiter les listes de tableaux comme des listes de taille fixe (comme les tableaux); cependant, au-delà de la fonctionnalité supplémentaire ajoutée par ArrayLists, il n'y a aucun avantage réel à utiliser des ArrayLists dont la taille est fixe car les ArrayLists (sur les tableaux) dans ce cas sont nettement plus lents.
D'après ma lecture, ArrayLists ne peut pas être irrégulier: "L'utilisation de tableaux multidimensionnels comme éléments ... n'est pas prise en charge". Encore une fois, un autre clou dans le cercueil d'ArrayLists. ArrayLists sont pas non plus « typés » - ce qui signifie que, tout en dessous, un ArrayList est tout simplement un tableau de dynamique d'objets: Object[]
. Cela nécessite beaucoup de boxe (implicite) et unboxing (explicite) lors de l'implémentation d'ArrayLists, ajoutant encore à leur surcharge.
Pensée sans fondement: je pense que je me souviens avoir lu ou entendu l'un de mes professeurs dire que les tableaux de tableaux sont en quelque sorte l'enfant conceptuel bâtard de la tentative de passer des tableaux aux collections de type liste, c'est-à-dire tout en ayant une fois été une grande amélioration des tableaux, ils ne sont plus la meilleure option car un développement plus poussé a été fait en ce qui concerne les collections
List (Of T): Ce qu'ArrayList est devenu (et espérait être)
La différence d'utilisation de la mémoire est suffisamment importante pour indiquer qu'une liste (Of Int32) a consommé 56% de mémoire en moins qu'une ArrayList contenant le même type primitif (8 Mo contre 19 Mo dans la démonstration liée de gentleman ci-dessus: encore une fois, liée ici ) - bien que c'est un résultat aggravé par la machine 64 bits. Cette différence montre vraiment deux choses: premièrement (1), un "objet" de type Int32 encadré (ArrayList) est beaucoup plus grand qu'un pur type primitif Int32 (List); deuxième (2), la différence est exponentielle en raison du fonctionnement interne d'une machine 64 bits.
Alors, quelle est la différence et qu'est-ce qu'une liste (de T) ? MSDN définit un List(Of T)
as, "... une liste fortement typée d'objets accessibles par index." L'importance ici est le bit "fortement typé": un List (Of T) 'reconnaît' les types et stocke les objets comme leur type. Ainsi, un Int32
est stocké comme un Int32
et non comme un Object
type. Cela élimine les problèmes causés par la boxe et le déballage.
MSDN spécifie que cette différence entre en jeu uniquement lors du stockage de types primitifs et non de types de référence. Trop, la différence se produit vraiment à grande échelle: plus de 500 éléments. Ce qui est plus intéressant, c'est que la documentation MSDN indique: "Il est avantageux d'utiliser l'implémentation spécifique au type de la classe List (Of T) au lieu d'utiliser la classe ArrayList ...."
Essentiellement, List (Of T) est ArrayList, mais en mieux. C'est "l'équivalent générique" d'ArrayList. Comme ArrayList, il n'est pas garanti d'être trié jusqu'à ce qu'il soit trié (allez comprendre). List (Of T) a également des fonctionnalités supplémentaires.