Dans cette question Comment puis-je sélectionner efficacement un conteneur de bibliothèque standard dans C ++ 11? est un organigramme pratique à utiliser lors du choix des collections C ++.
J'ai pensé que c'était une ressource utile pour les personnes qui ne savaient pas quelle collection ils devraient utiliser, j'ai donc essayé de trouver un organigramme similaire pour Java et je n'ai pas pu le faire.
Quelles ressources et «aide-mémoire» sont disponibles pour aider les gens à choisir la bonne collection à utiliser lors de la programmation en Java? Comment les gens savent-ils quelles implémentations List, Set et Map ils doivent utiliser?
Réponses:
Comme je n'ai pas trouvé d'organigramme similaire, j'ai décidé d'en créer un moi-même.
Cet organigramme n'essaie pas de couvrir des choses comme l'accès synchronisé, la sécurité des threads, etc. ou les collections héritées, mais il couvre les 3 ensembles standard , 3 cartes standard et 2 listes standard .
Cette image a été créée pour cette réponse et est sous licence Creative Commons Attribution 4.0 International License. L'attribution la plus simple consiste à établir un lien vers cette question ou cette réponse.
Autres ressources
L'autre référence probablement la plus utile est la page suivante de la documentation oracle qui décrit chaque collection .
HashSet vs TreeSet
Il y a une discussion détaillée sur quand utiliser
HashSet
ouTreeSet
ici: Hashset vs TreesetArrayList vs LinkedList
Discussion détaillée: Quand utiliser LinkedList sur ArrayList?
la source
LinkedList
vs.ArrayList
Premièrement, si la liste est de taille significative,LinkedList
c'est préférable.LinkedList
a une surcharge par élément, il est donc asymptotiquement pire en termes de consommation de mémoire qu'unArrayList
. De plus, si la plupart des accès se trouvent à la fin de la liste, unArrayList
est préférable car il fournit un accès aléatoire aux éléments en temps constant. Accéder aun
e élément de aLinkedList
est uneO(n)
opération. ... En fait, la décision d'utiliser une liste chaînée devrait presque toujours être "non".LinkedList
est une double liste chaînée, donc l'accès au début et à la fin sont tous deux rapides. Vous noterez que parmi les branches ci-dessus, les trois questions doivent répondre oui avant de recommander l'utilisation deLinkedList
- donc en d'autres termes, je suis d'accord avec vous que dans la plupart des cas, la réponse est non. Des choses comme les files d'attente et les retraits de file d'attente où vous ajoutez et supprimez constamment des éléments aux extrémités de la zone de liste sont un bon cas d'utilisationLinkedList
.LinkedList
utilise plus de mémoire par élément ...ArrayList
ne libère jamais de mémoire. Cela signifie que si vous avez une liste qui atteint parfois une taille énorme mais qui est généralement petite, alorsArrayList
les performances de la mémoire seront moins bonnes. La surcharge de mémoire deList
lui-même est généralement (mais pas toujours) faible par rapport à celle des éléments qu'il contient également.Map<K,V>
n'est pas la partie dejava.util.collection
Résumé des principales collections non simultanées et non synchronisées
Collection
: Une interface représentant un "sac" d'articles non ordonné, appelé "éléments". L'élément "suivant" n'est pas défini (aléatoire).Set
: Une interface représentant unCollection
sans doublon.HashSet
: UnSet
soutenu par unHashtable
. Utilisation de la mémoire la plus rapide et la plus petite, lorsque la commande n'a pas d'importance.LinkedHashSet
: AHashSet
avec l'ajout d'une liste chaînée pour associer des éléments dans l' ordre d'insertion . L'élément "suivant" est l'élément inséré le plus récemment.TreeSet
: ASet
où les éléments sont ordonnés par unComparator
(typiquement ordre naturel ). Utilisation de la mémoire la plus lente et la plus importante, mais nécessaire pour la commande basée sur un comparateur.EnumSet
: Une personnalisation extrêmement rapide et efficaceSet
pour un seul type d'énumération.List
: Une interface représentant unCollection
dont les éléments sont ordonnés et ont chacun un index numérique représentant sa position, où zéro est le premier élément et(length - 1)
le dernier.ArrayList
: AList
soutenu par un tableau, où le tableau a une longueur (appelée «capacité») qui est au moins aussi grande que le nombre d'éléments (la «taille» de la liste). Lorsque la taille dépasse la capacité (lorsque l'(capacity + 1)-th
élément est ajouté), le tableau est recréé avec une nouvelle capacité de -(new length * 1.5)
cette récréation est rapide, car elle utiliseSystem.arrayCopy()
. La suppression et l'insertion / l'ajout d'éléments nécessitent que tous les éléments voisins (à droite) soient déplacés dans ou hors de cet espace. L'accès à n'importe quel élément est rapide, car il ne nécessite que le calcul(element-zero-address + desired-index * element-size)
pour trouver son emplacement. Dans la plupart des situations , unArrayList
est préférable à unLinkedList
.LinkedList
: AList
soutenu par un ensemble d'objets, chacun lié à ses voisins "précédent" et "suivant". ALinkedList
est également unQueue
etDeque
. L'accès aux éléments se fait en commençant au premier ou au dernier élément, et en parcourant jusqu'à ce que l'index souhaité soit atteint. L'insertion et la suppression, une fois que l'index souhaité est atteint par traversée, est une question triviale de remapper uniquement les liens voisins immédiats pour pointer vers le nouvel élément ou contourner l'élément maintenant supprimé.Map
: Une interface représentant unCollection
où chaque élément a une "clé" d'identification - chaque élément est une paire clé-valeur.HashMap
: AMap
où les clés ne sont pas ordonnées et sont soutenues par aHashtable
.LinkedhashMap
: Les clés sont classées par ordre d' insertion .TreeMap
: AMap
où les clés sont ordonnées par unComparator
(typiquement ordre naturel).Queue
: Une interface qui représente unCollection
élément où les éléments sont généralement ajoutés à une extrémité et supprimés de l'autre (FIFO: premier entré, premier sorti).Stack
: Une interface qui représente unCollection
élément où les éléments sont, généralement, à la fois ajoutés (poussés) et supprimés (sautés) de la même extrémité (LIFO: dernier entré, premier sorti).Deque
: Abréviation de "file d'attente double", généralement prononcée "deck". Une liste liée qui est généralement ajoutée et lue à chaque extrémité (pas au milieu).Diagrammes de collecte de base:
Comparaison de l'insertion d'un élément avec un
ArrayList
etLinkedList
:la source
Une image encore plus simple est ici. Intentionnellement simplifié!
La collection est tout ce qui contient des données appelées «éléments» (du même type). Rien de plus spécifique n'est supposé.
List est unecollection indexée de données où chaque élément a un index. Quelque chose comme le tableau, mais plus flexible.
Les données de la liste conservent l'ordre d'insertion.
Opération typique: obtenir le n-ième élément.
L'ensemble est un sac d'éléments , chaque élément une seule fois (les éléments se distinguent par leur
equals()
méthode.Les données de l'ensemble sont stockées principalement pour savoir quelles sont les données présentes.
Opération typique: dire si un élément est présent dans la liste.
La carte est quelque chose comme la liste, mais au lieu d'accéder aux éléments par leur index entier, vous y accédez par leur clé , qui est n'importe quel objet. Comme le tableau en PHP :)
Les données de la carte peuvent être recherchées par leur clé.
Opéraion typique: obtenir un élément par son ID (où ID est de n'importe quel type, pas seulement
int
comme dans le cas de List).Les différences
Set and Map: dans Set vous recherchez les données par eux - mêmes , tandis que dans Map par leur clé .
List and Map: dans List vous accédez à l'élément par leur
int
index (position dans List), tandis que dans Map par leur clé quel os de n'importe quel type (typiquement: ID)List and Set: dans List les éléments sont liés par leur position et peuvent être dupliqués, tandis que dans Set les éléments sont juste "present" (pr not present) et sont uniques (au sens de
equals()
, oucompareTo()
pourSortedSet
)la source
C'est simple: si vous avez besoin de stocker des valeurs avec des clés qui y sont mappées, allez dans l'interface Map, sinon utilisez List pour les valeurs qui peuvent être dupliquées et utilisez enfin l'interface Set si vous ne voulez pas de valeurs dupliquées dans votre collection.
Voici l'explication complète http://javatutorial.net/choose-the-right-java-collection , y compris l'organigramme, etc.
la source
Carte
Si vous choisissez a
Map
, j'ai fait ce tableau résumant les fonctionnalités de chacune des dix implémentations fournies avec Java 11.la source
Collections communes, collections communes
la source
Quelle collection Java dois-je utiliser?
Cela dépend du problème que vous essayez de résoudre ou des exigences que vous avez.
Exemples :
la source