web-dev-qa-db-fra.com

Quelle collection Java dois-je utiliser?

Dans cette question Comment puis-je sélectionner efficacement un conteneur de bibliothèque standard dans C++ 11? est un organigramme pratique à utiliser pour choisir des collections C++.

Je pensais que c'était une ressource utile pour les personnes qui ne savaient pas quelle collection utiliser, alors j'ai essayé de trouver un organigramme similaire pour Java et je n'ai pas pu le faire.

Quelles ressources et "feuilles de triche" 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 de List, Set et Map ils doivent utiliser?

118
Tim B

N'ayant pas pu trouver un organigramme similaire, j'ai décidé d'en créer un moi-même.

Cet organigramme n'essaie pas de couvrir des éléments tels que l'accès synchronisé, la sécurité des threads, etc. ou les collections héritées, mais couvre les 3 standards Set s, 3 Standard Carte s et 2 standard Liste s.

enter image description here

Cette image a été créée pour cette réponse et est disponible sous une licence Licence internationale de Creative Commons Attribution 4.0. La solution la plus simple consiste à créer un lien vers cette question ou cette réponse.

Autres ressources

L’autre référence la plus utile est probablement la page suivante de la documentation Oracle qui décrit chaque Collection .

HashSet vs TreeSet

Il y a une discussion détaillée de quand utiliser HashSet ou TreeSet ici: Hashset vs Treeset

ArrayList vs LinkedList

Discussion détaillée: Quand utiliser LinkedList sur ArrayList?

268
Tim B

Résumé des principales collections non simultanées et non synchronisées

Collection : Interface représentant un "sac" d'éléments non ordonné, appelé "éléments". L'élément "next" est indéfini (aléatoire).

  • Set : interface représentant un Collection sans doublon.
    • HashSet : A Set soutenu par un Hashtable . L'utilisation de la mémoire la plus rapide et la plus petite possible, lorsque la commande est sans importance.
    • LinkedHashSet : A HashSet avec l'ajout d'une liste liée à laquelle associer des éléments ordre d'insertion. L'élément "next" est l'élément inséré le plus récemment.
    • TreeSet : A Set où les éléments sont ordonnés par un Comparator (généralement ordre naturel ). Utilisation de la mémoire la plus lente et la plus importante, mais nécessaire pour les commandes basées sur un comparateur.
    • EnumSet : Un Set extrêmement rapide et efficace, personnalisé pour un seul type enum.
  • List : une interface représentant un Collection dont les éléments sont ordonnés et ont chacun une index numérique représentant sa position, où zéro est le premier élément et (length - 1) est le dernier.
    • ArrayList : un List sauvegardé par un tableau, où le tableau a une longueur (appelé "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'élément (capacity + 1)-th Est ajouté), le tableau est recréé avec une nouvelle capacité de (new length * 1.5) - cette recréation est rapide car elle utilise System.arrayCopy() . La suppression et l'insertion/l'ajout d'éléments nécessitent que tous les éléments voisins (à droite) soient déplacés vers cet espace ou hors de celui-ci. 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 , un ArrayList est préféré à un LinkedList.
    • LinkedList : un List soutenu par un ensemble d'objets liés chacun à son "précédents" et "prochains" voisins. Un LinkedList est aussi un Queue et Deque. L'accès aux éléments s'effectue en commençant par le premier ou le dernier élément et en parcourant jusqu'à atteindre l'index souhaité. Insertion et suppression, une fois que l'index souhaité est atteint via traversal est une affaire triviale consistant à remapper uniquement les liens de voisinage immédiat pour pointer vers le nouvel élément ou ignorer l'élément maintenant supprimé.
  • Map : interface représentant une Collection où chaque élément possède une "clé d'identification" "- Chaque élément est une paire clé-valeur.
    • HashMap : A Map où les clés ne sont pas ordonnées et appuyées par un Hashtable.
    • LinkedhashMap : Les clés sont classées par ordre d'insertion.
    • TreeMap : A Map où les clés sont ordonnées par un Comparator (ordre typiquement naturel).
  • Queue : interface représentant un Collection où les éléments sont généralement ajoutés à une extrémité et retiré de l'autre (FIFO: premier entré, premier sorti).
  • Stack : interface représentant un Collection où les éléments sont généralement les deux. ajouté (poussé) et enlevé (sauté) de la même extrémité (LIFO: dernier entré, premier sorti).
  • Deque : Abréviation de "file d'attente double", généralement prononcé "paquet". Une liste chaînée qui est généralement ajoutée et lue uniquement à l'une des extrémités (pas au milieu).

Diagrammes de collecte de base:

diagram

Comparaison de l'insertion d'un élément avec ArrayList et LinkedList:

diagram

60
aliteralmind

Une image encore plus simple est ici. Intentionnellement simplifié!

  1. 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é.

  2. Liste est un indexé collection 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: récupérez le nième élément.

  3. Set est un sac d'éléments, chaque élément une seule fois (les éléments sont distingués en utilisant leur méthode equals().

    Les données de l'ensemble sont stockées principalement pour savoir quoi les données sont là.

    Opération typique: indique si un élément est présent dans la liste.

  4. Map ressemble à la liste, mais au lieu d'accéder aux éléments par leur index entier, vous y accédez par leur key, qui est n'importe quel objet. Comme le tableau dans PHP :)

    Les données de la carte sont consultables par leur clé.

    Opération typique: obtenir un élément par son ID (où ID est de n'importe quel type, pas seulement int comme dans le cas de la liste).

Les différences

  • Set and Map: in Set You search data par eux-mêmes, tandis que dans Map par leur clé.

  • List and Map: dans List, vous accédez à l'élément par son int index (position dans List), tandis que dans Map par sa clé, quel que soit son type (typiquement: ID)

  • List et 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 simplement "présents" (pr non présents) et uniques (au sens de equals(), ou compareTo() pour SortedSet )

11
Honza Zidek

C’est simple: si vous avez besoin de stocker des valeurs avec les clés mappées sur celles-ci, utilisez l’interface Map, sinon utilisez List pour les valeurs pouvant être dupliquées et utilisez l’interface Set si vous ne voulez pas que les valeurs soient dupliquées dans votre collection.

Voici l'explication complète http://javatutorial.net/choose-the-right-Java-collection , avec organigramme, etc.

1
filip_j

Collections communes, Collections communes enter image description here

0
Aliaksandr Shpak