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 de collections C++.

Je pensais que c'était une ressource utile pour les personnes qui ne savent pas quelle collection elles devraient utiliser, j'ai donc 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 liste, d'ensemble et de carte ils devraient utiliser?

Author: Community, 2014-02-24

4 answers

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 choses comme l'accès synchronisé, la sécurité des threads, etc. ou les collections héritées, mais il couvre les 3 standards Sets, 3 standards Maps et 2 standards List s.

entrez la description de l'image ici

Cette image a été créée pour cette réponse et est sous licence Creative Commons Attribution 4.0 International License. Le plus simple l'attribution se fait par lien vers cette question ou cette réponse.

D'Autres ressources

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

Jeu de hachage vs Jeu d'arbres

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 utilisez LinkedList sur ArrayList?

 218
Author: Tim B, 2017-05-23 11:47:31

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

Collection: Une interface représentant un non ordonnée "sac" d'éléments, appelés "éléments". L'élément "suivant" est indéfini (aléatoire).

  • Set: Une interface représentant un Collection avec pas de doublons.
    • HashSet: Un Set, soutenu par un Hashtable. La plus rapide et la plus petite utilisation de la mémoire, lors de la commande est insignifiant.
    • LinkedHashSet: Un HashSet, avec l'ajout d'une liste liée à associer des éléments dans la commande d'insertion. L'élément "suivant"est l'élément le plus récemment inséré.
    • TreeSet: Un Set, où les éléments sont commandés par un Comparator (généralement, naturel de la commande). Utilisation de la mémoire la plus lente et la plus importante, mais nécessaire pour la commande basée sur un comparateur.
    • EnumSet: Un très rapide et efficace Set personnalisé pour un seul type d'énumération.
  • List: Une interface représentant un Collection dont les éléments sont ordonnés et ont chacun un index numérique représentant sa position, où le zéro est le premier élément, et (length - 1) est la dernière.
    • ArrayList: Un List soutenu par un tableau, où le tableau a une longueur (appelé "capacité") qui est au moins aussi grand que le nombre d'éléments (la liste de la "taille"). 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) this cette récréation est rapide, car elle utilise System.arrayCopy(). La suppression et l'insertion/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, un ArrayList est préférable à un LinkedList.
    • LinkedList: Un List, soutenu par un ensemble d'objets, chacun étant lié à son "précédent" et "suivant" voisins. Un LinkedList est aussi un Queue et Deque. L'accès aux éléments se fait à partir du premier ou du dernier élément et jusqu'à ce que l'index souhaité soit atteint. L'insertion et la suppression, une fois que l'index souhaité est atteint via la traversée{[74] } est une question triviale de re-mappage uniquement les liens voisins immédiats pour pointer vers le nouvel élément ou contourner le élément maintenant supprimé.
  • Map: Une interface représentant une Collection où chaque élément a une identification de la "clé"--chaque élément est une paire clé-valeur.
    • HashMap: Un Map où les touches sont non ordonnée, et soutenu par un Hashtable.
    • LinkedhashMap: les Touches sont commandés par la commande d'insertion.
    • TreeMap: Un Map où les touches sont commandés par un Comparator (généralement commande naturelle).
  • Queue: Une interface qui représente un Collection où les éléments sont, typiquement, ajoutés à une extrémité, et retirés de l'autre (FIFO: premier entré, premier sorti).
  • Stack: Une interface qui représente un Collection où les éléments sont, généralement, à la fois ajoutés (poussés) et supprimés (sautés) à partir de la même extrémité (LIFO: dernier entré, premier sorti).
  • Deque: abréviation de "double fin file d'attente", généralement prononcé "pont". Une liste chaînée qui n'est généralement ajoutée et lue qu'à l'une ou l'autre extrémité (pas au milieu).

Diagrammes de collection de base:

diagramme

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

diagramme

 46
Author: aliteralmind, 2017-09-17 23:10:13

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

  1. La collection est tout ce qui contient des données appelées "éléments" (du même type). Rien de plus précis qui est utilisé.

  2. Liste est un indexé collecte 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 de, chaque éléments 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 quelles sont les données.

  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 objet. Comme le tableau en PHP:)

    Données de la carte sont consultables par leur clé.

    La principale différence entre l'ensemble et le Carte, c'est que dans l'Ensemble vous recherche données par eux-mêmes, alors que, dans le plan par leur touche.

 9
Author: Honza Zidek, 2015-08-29 20:03:54

C'est simple: si vous devez stocker des valeurs avec des clés mappées, optez pour 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

 1
Author: filip_j, 2014-11-02 12:10:14