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?
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.
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?
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 unCollection
avec pas de doublons.-
HashSet
: UnSet
, soutenu par unHashtable
. La plus rapide et la plus petite utilisation de la mémoire, lors de la commande est insignifiant. -
LinkedHashSet
: UnHashSet
, 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
: UnSet
, où les éléments sont commandés par unComparator
(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 efficaceSet
personnalisé 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ù le zéro est le premier élément, et(length - 1)
est la dernière.-
ArrayList
: UnList
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 utiliseSystem.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, unArrayList
est préférable à unLinkedList
. -
LinkedList
: UnList
, soutenu par un ensemble d'objets, chacun étant lié à son "précédent" et "suivant" voisins. UnLinkedList
est aussi unQueue
etDeque
. 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 uneCollection
où chaque élément a une identification de la "clé"--chaque élément est une paire clé-valeur.-
HashMap
: UnMap
où les touches sont non ordonnée, et soutenu par unHashtable
. -
LinkedhashMap
: les Touches sont commandés par la commande d'insertion. -
TreeMap
: UnMap
où les touches sont commandés par unComparator
(généralement commande naturelle).
-
-
Queue
: Une interface qui représente unCollection
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 unCollection
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:
Comparant l'insertion d'un élément avec un ArrayList
et LinkedList
:
Une image encore plus simple est ici. Volontairement simplifié!
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é.
-
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.
-
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.
-
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.
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