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++.

j'ai pensé que c'était une ressource utile pour les gens qui ne sont pas sûrs de la collection qu'ils devraient utiliser, donc j'ai essayé de trouver un organigramme similaire pour Java et n'a pas été en mesure de le faire.

quelles ressources et "feuilles de tricherie" sont disponibles pour aider les gens à choisir droit de collecte à utiliser lors de la programmation en Java? Comment les gens savent-ils quelles implémentations List, Set et Map ils devraient utiliser?

102
demandé sur Community 2014-02-24 00:53:00

4 réponses

comme je n'ai pas pu trouver un organigramme similaire, j'ai décidé d'en faire un moi-même.

ce diagramme n'essaie pas de couvrir des choses comme l'accès synchronisé, la sécurité du fil, etc ou les collections héritées, mais il couvre les 3 standards Set s, 3 standard Map s et 2 standard List s.

enter image description here

cette image a été créé pour cette réponse et est sous licence sous licence internationale Creative Commons Attribution 4.0. l'attribution la plus simple est d'établir un lien avec cette question ou cette réponse.

autres ressources

probablement L'autre référence la plus utile est 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 over ArrayList?

218
répondu Tim B 2017-05-23 11:47:31

Résumé des principales non-simultanées, non synchronisée collections

Collection : une interface représentant un "sac" d'articles, appelé "elements". L'élément "suivant" n'est pas défini (aléatoire).

  • Set : une interface représentant un Collection sans duplicata.
    • HashSet : un Set soutenu par un Hashtable . Utilisation de la mémoire la plus rapide et la plus petite, lors de la commande est sans importance.
    • LinkedHashSet : A HashSet avec l'ajout d'une liste liée aux éléments associés dans ordre d'insertion . Le "prochain", constitue l'élément suivant-plus récemment inséré élément.
    • TreeSet : un Set où les éléments sont ordonnés par un Comparator (typiquement commande naturelle ). L'utilisation de mémoire la plus lente et la plus grande, mais nécessaire pour la commande basée sur un comparateur.
    • EnumSet : un Set extrêmement rapide et efficace personnalisé pour un type enum simple.
  • 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ù Zéro est le premier élément, et (length - 1) est le dernier.
    • ArrayList : un List soutenu par un tableau, où le tableau a un 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) --cette récréation est rapide, car il utilise System.arrayCopy() . Supprimer et insérer / ajouter des éléments nécessite 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 calcul (element-zero-address + desired-index * element-size) pour trouver son emplacement. dans la plupart des cas , un ArrayList est préféré à un LinkedList .
    • LinkedList : un List soutenu par un ensemble d'objets, chacun lié à ses voisins" précédents "et" suivants". 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 en traversant jusqu'à ce que l'indice désiré est atteint. Insertion et suppression, une fois que l'index désiré est atteint par l'intermédiaire de la traversée est une question triviale de re-mappage seulement les liens de voisinage immédiat pour pointer vers le nouvel élément ou contourner l'élément maintenant supprimé.
  • Map : une interface représentant un Collection où chaque élément a une"clé" d'identification--chaque élément est une paire clé-valeur.
    • HashMap : un Map où les clés ne sont pas ordonnées, et sont appuyées par un Hashtable .
    • LinkedhashMap : les clés sont commandées par "ordre d'insertion .
    • TreeMap : un Map où les clés sont commandé 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: first-in, first-out).
  • Stack : une interface qui représente un Collection où les éléments sont, typiquement, à la fois ajoutés (poussés) et retirés (sautés) de la même extrémité (LIFO: last-in, first-out).
  • Deque : abréviation de" file d'attente double extrémité", habituellement prononcé"deck". Une liste, qui est généralement ajoutée et de lire de part et d'autre (pas au milieu).

Schémas de collection de base:

diagram

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

diagram

46
répondu aliteralmind 2017-09-17 23:10:13

voici une image encore plus simple. Intentionnellement simplifié!

  1. 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é recueil de données où chaque élément a un index. Quelque chose comme la matrice, mais plus souple.

    données dans la liste garder l'ordre d'insertion.

  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 dans l'ensemble sont stockées principalement juste pour savoir ce que données sont là.

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

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

    Le principal la différence entre le Jeu et la Carte est que, dans l'Ensemble, vous recherche données par eux-mêmes , tandis que dans la carte par leur clé .

9
répondu Honza Zidek 2015-08-29 20:03:54

c'est simple: si vous avez besoin de stocker des valeurs avec des clés qui leur sont associées, allez pour l'interface Map, sinon utilisez List pour les valeurs qui peuvent être dupliquées et finalement 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 organigramme etc

1
répondu filip_j 2014-11-02 12:10:14