Quelle collection Java dois-je utiliser?

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

Je pensais que c’était une ressource utile pour les personnes qui ne sont pas sûres de la collection à utiliser, alors j’ai essayé de trouver un organigramme similaire pour Java et je n’ai pas pu le faire.

Quelles ressources et quelles feuilles d’aide sont disponibles pour aider les utilisateurs à choisir la bonne collection à utiliser lors de la programmation en Java? Comment les gens savent-ils quelles implémentations List, Set et Map ils devraient utiliser?

Comme je ne pouvais pas 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’access synchronisé, la sécurité des threads, etc. ou les anciennes collections, mais il couvre les 3 ensembles standard, 3 cartes standard et 2 listes standard.

entrer la description de l'image ici

Cette image a été créée pour cette réponse et est sous licence Creative Commons Atsortingbution 4.0 International License. L’atsortingbution la plus simple consiste à lier soit cette question, soit cette réponse.

Autres ressources

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

HashSet vs TreeSet

Il y a une discussion détaillée sur le moment d’utiliser HashSet ou TreeSet ici: Hashset vs Treeset

ArrayList vs LinkedList

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

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

Collection : interface représentant un “sac” non ordonné d’éléments, appelés “éléments”. L’élément “next” est indéfini (random).

  • Set : interface représentant une Collection sans doublons.
    • HashSet : Un Set soutenu par une HashSet . Plus rapide et plus petite utilisation de la mémoire, lorsque la commande est sans importance.
    • LinkedHashSet : Un HashSet avec l’ajout d’une liste liée pour associer des éléments dans l’ ordre d’insertion . L’élément “next” est l’élément inséré le plus récemment.
    • TreeSet : Un Set où les éléments sont classés par un Comparator (généralement un ordre naturel ). Utilisation de la mémoire la plus lente et la plus importante, mais nécessaire pour le classement par comparateur.
    • EnumSet : Un ensemble extrêmement rapide et efficace personnalisé pour un seul type enum.
  • List : interface représentant une Collection dont les éléments sont ordonnés et chacun possède un index numérique représentant sa position, où zéro est le premier élément et (length - 1) le dernier.
    • ArrayList : une List sauvegardée par un tableau, dont la longueur (appelée “capacité”) correspond au moins au 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 récréation est rapide, car elle utilise System.arrayCopy() . La suppression et l’insertion / l’ajout d’éléments nécessite que tous les éléments voisins (à droite) soient déplacés dans ou hors de cet espace. L’access à 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 cas , une ArrayList est préférable à une LinkedList .
    • LinkedList : List sauvegardée par un ensemble d’objects, chacun lié à ses voisins “précédent” et “suivant”. Une LinkedList est aussi une Queue et un Deque . L’access 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 désiré est atteint via traversal est une question sortingviale de ne mapper que les liens de voisinage immédiat pour pointer vers le nouvel élément ou contourner l’élément maintenant supprimé.
  • Map : interface représentant une Collection où chaque élément a une “clé” d’identification – chaque élément est une paire clé-valeur.
    • HashMap : une Map où les clés ne sont pas classées et sont sauvegardées par une HashMap .
    • LinkedhashMap : les clés sont classées par ordre d’ insertion .
    • TreeMap : Une Map où les clés sont classées par un Comparator (généralement un ordre naturel).
  • Queue : interface représentant une Collection où les éléments sont généralement ajoutés à une extrémité et retirés de l’autre (FIFO: premier entré, premier sorti).
  • Stack : une interface qui représente une Collection où les éléments sont généralement ajoutés (poussés) et supprimés (déplacés) du même bout (LIFO: dernier entré, premier sorti).
  • Deque : Deque de “queue double”, généralement prononcée “deck”. Une liste liée qui est généralement ajoutée à et lue à partir de chaque extrémité (pas le milieu).

Diagrammes de collection de base:

diagramme

En comparant l’insertion d’un élément avec ArrayList et LinkedList :

diagramme

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. List est une collection 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.

  3. Set est un sac d’éléments , chacun des éléments juste une fois (les éléments sont distingués en utilisant leur méthode equals() .

    Les données dans l’ensemble sont stockées principalement juste pour savoir quelles données sont là.

  4. Map 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 object. Comme le tableau en PHP 🙂

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

    La principale différence entre l’ensemble et la carte réside dans le fait que dans le jeu, vous recherchez des données par ellesmêmes , alors qu’elles se trouvent sur la carte par leur clé .

C’est simple: si vous avez besoin de stocker des valeurs avec des clés qui leur sont associées, choisissez l’interface Map, sinon utilisez List pour les valeurs qui peuvent être dupliquées et enfin utilisez 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.